Seek the Name, Seek the Fame
题目描述
原题来自: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;
}
}