Seek the Name, Seek the Fame
阿新 • • 發佈:2020-07-25
題目描述
原題來自:POJ 2752
給定若干字串(這些字串總長 \(\leq 4 \times 10^5\)),在每個字串中求出所有既是字首又是字尾的子串長度。
例如:ababcababababcabab
,既是字首又是字尾的:ab
,abab
,ababcabab
,ababcababababcabab
。
輸入格式
輸入若干行,每行一個字串。
輸出格式
對於每個字串,輸出一行,包含若干個遞增的整數,表示所有既是字首又是字尾的子串長度。
樣例
樣例輸入
ababcababababcabab
aaaaa
樣例輸出
2 4 9 18
1 2 3 4 5
code
#include <bits/stdc++.h> using namespace std; const int maxn=4e5+100; const int base=233; char s[maxn]; int poww[maxn],hash[maxn]; int main(){ while(cin>>s+1){ int len=strlen(s+1); poww[1]=233; for(int i=2;i<=len;i++) poww[i]=poww[i-1]*base; hash[1]=s[1]; for(int i=2;i<=len;i++) hash[i]=hash[i-1]*base+s[i]; for(int i=1,j;i<=len;i++){ j=len-i+1; if(hash[i]-hash[0]*poww[i] == hash[len]-hash[j-1]*poww[i]) cout<<i<<" "; } cout<<endl; } }