Seek the Name, Seek the Fame

题目描述

原题来自:POJ 2752

给定若干字符串(这些字符串总长 \(\leq 4 \times 10^5\)),在每个字符串中求出所有既是前缀又是后缀的子串长度。

例如:ababcababababcabab,既是前缀又是后缀的:abababababcababababcababababcabab

输入格式

输入若干行,每行一个字符串。

输出格式

对于每个字符串,输出一行,包含若干个递增的整数,表示所有既是前缀又是后缀的子串长度。

样例

样例输入

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;
	}
}
posted @ 2020-07-25 20:28  hyskr  阅读(219)  评论(1编辑  收藏  举报