1. 程式人生 > 實用技巧 >Seek the Name, Seek the Fame

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;
	}
}