「2.1」前缀后缀
问题背景
Seek the Name, Seek the Fame
题目描述
给定若干字符串(这些字符串总长 ≤4×10^5),在每个字符串中求出所有既是前缀又是后缀的子串长度。
例如:ababcababababcabab,既是前缀又是后缀的:ab,abab,ababcabab,ababcababababcabab。
输入格式
输入若干行,每行一个字符串。
输出格式
对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。
样例输入1
ababcababababcabab
aaaaa
样例输出1
2 4 9 18
1 2 3 4 5
#include<bits/stdc++.h>
using namespace std;
string s;
unsigned long long h[400002],gh[400002]={1};
int len,lmax=1;
unsigned long long geth(int l,int r){
return h[r]-h[l-1]*gh[r-l+1];
}
int main(){
ios::sync_with_stdio(0);
while(cin>>s){
len=s.size();
s=" "+s;
for(int i=1;i<=len;i++){
h[i]=h[i-1]*131+s[i];
}
for(int i=lmax;i<=len;i++){
gh[i]=gh[i-1]*131;
}
lmax=max(lmax,len);
for(int i=1;i<=len;i++){
if(geth(1,i)==geth(len-i+1,len)){
cout<<i<<" ";
}
}
cout<<"\n";
}
}