#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long LL;//自然溢出
const int N=1e6+5;
LL in[N],sum[N];
char ch[N];
int b=31;//设置基数
vector<int>vis;
int main()
{ int len;
in[0]=1;//必须是1
for(int i=1;i<N;i++) in[i]=in[i-1]*b;//预处理出基数
while(cin>>ch+1)
{ vis.clear();
len=strlen(ch+1);
sum[0]=0;//必须是0
for(int i=1;i<=len;i++)//生成哈希值
sum[i]=sum[i-1]*b+(LL)(ch[i]-'a'+1);
for(int i=1;i<=len;i++)
{
LL tp=sum[len]-sum[len-i]*in[i];//注意前后关系,i是字符串的长度
if (tp==sum[i]) vis.push_back(i);
}
for(int i=0;i<vis.size();i++)
if (i!=vis.size()-1) cout<<vis[i]<<" ";
else cout<<vis[i]<<endl;
}
return 0;
}
哈希--loj10036
最新推荐文章于 2020-03-29 10:42:37 发布