時間限制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(多乙個『#』)
莫得辦法。
**如下:
#includeusingnamespace
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 ...