poj2752Seek the Name, Seek the Fame

poj2752

http://poj.org/problem?id=2752

 

在每个字符串中求出所有既是前缀又是后缀的子串长度。

很水的hash。直接暴力枚举长度,再比对hash值即可。

注意:s既是s的前缀,又是s的后缀。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define p 999983
#define q 1000000007
#define ull unsigned long long
using namespace std;

char s[400001];
ull po[400001],qo[400001],h[400001],h2[400001];
int main()
{
	po[0]=qo[0]=1;
	for(int i=1;i<=400000;++i) po[i]=po[i-1]*p,qo[i]=qo[i-1]*q;
	while(~scanf("%s",s+1)){
		int n=strlen(s+1);
		for(int i=1;i<=n;++i) h[i]=h[i-1]*p+s[i],h2[i]=h2[i-1]*q+s[i];
		ull x=0,x2=0;
		bool f=0;
		for(int i=1;i<=n;++i){
			x=x*p+s[i];
			x2=x2*q+s[i];
			if(x==h[n]-h[n-i]*po[i]&&x2==h2[n]-h2[n-i]*qo[i]){
				if(f) printf(" ");
				printf("%d",i),f=1;
			}
		}
		printf("\n");
	}
}

 

你可能感兴趣的:(字符串hash)