明豪的疑惑

2022-05-25 04:09:09 字數 1656 閱讀 9461

時間限制3.5s,空間512mb

題目描述

t組資料,每組給出一段字串,求其中不同的回文串有幾個。

資料範圍

t<=10,len<=1e6.

題目解析

正解是回文自動機,答案為自動機中節點數-2,但是並不會。

考場上寫了乙個花裡胡哨的馬拉車加trie。

跑馬拉車時若當前直接匹配到的地方為cj[i],則用並查集加二分查詢找出該點所對應的trie節點,之後繼續匹配時向trie中加數,答案是trie中非『#』字元個數。複雜度o(len *loglen*t).

**了100——20.無法debug.

發現其他人暴力過了。於是可以在匹配完成後如果該串長度大於cj[zai*2-i],則暴力往trie中加入該回文串(除第一位外不加『#』),複雜度o(玄學)。答案即為trie中節點個數-1(多乙個『#』)

莫得辦法。

**如下:

#includeusing

namespace

std;

const

int n=2e6+5

;int t,cnt,dao,n,cj[n],r,zai,ans,now,dui[200

],dapan;

char

c[n],s[n];

struct

pigu

tier[n

<<1

];inline

intread()

while(isdigit(c))

return x*f;}//

inline int pan(int &x)

////

inline int findfa(int x)

////

inline int find(int zn,int hd)

////

if(zd==0) return ve[vef[zn][zd]][hd-1];

//else return ve[vef[zn][zd]][hd-ves[zn][zd-1]-1];//}

//queue que;

//inline void qingkongtier()

////}//

}inline void insert(int now,int

you)

else

nu=tier[nu].er[dui[c[i]]];

}} int

main()

n=n*2+1;c[n+1]='%'

;

for(int i=1;i<=n;i++)

memset(tier[

0].er,0,sizeof(tier[0

].er));

cout

<1

<<"\n"

; }

fclose(stdin);

fclose(stdout);

return0;

}/*3aaaa

mymom

abba

2ithinkifiamherehewillnotdie

auutpppfotttoduergggepsekkssu

*/

小凱的疑惑

小凱手中有兩種面值的金幣,兩種面值均為正整數且彼此互素。每種金幣小凱都有無數個。在不找零的情況下,僅憑這兩種金幣,有些物品他是無法準確支付的。現在小凱想知道在無法準確支付的物品中,最貴的價值是多少金幣?注意 輸入資料保證存在小凱無法準確支付的商品。輸入格式 輸入資料僅一行,包含兩個正整數a和b,它們...

關於getopt long的疑惑

下面是乙個簡單的解析命令列引數的程式,但是如果把 static const char const shortopts ho v static const struct option longopts void formatprocname char argv,char procname,int si...

快排的疑惑?

以前一直不理解快排是什麼東西,那天忘記看了乙個什麼突然感覺明白了快排是什麼東東。然後以公升序排列為例寫了乙個程式。然後按照下面的思路寫了一段 快排就是找乙個數作為基數,與其比較比起比起小的放在左邊,比其大的放其右邊,遞迴其左右,一般情況下是選第乙個數作為基數。void swap int x,int ...