HUST 1328 String KMP

题目地址


用NEXT数组的性质 ,NEXT数组的值表示该位置下与前缀相同的位数。

cur[ i ] 储存 前缀 i 个字母与S串相同的数量。

#include<stdio.h>
#include<string.h>
#define MAX 100010
char s[100010];
long long next[100010],cur[100010];
long long len,sum;
void getnext()
{
	long long i=0,j=-1;
	next[0]=j;
	while(i<len){
		if(j==-1||s[i]==s[j])
			i++,j++,next[i]=j;
		else j=next[j];
	}
}

int main(){
	long long i,t;
	scanf("%lld",&t);
	while(t--){
		getchar();
		scanf("%s",s);
		sum=0;
		len=strlen(s);
		getnext();
		memset(cur,0,sizeof(cur));
		cur[0]=1;
		for(i=1;i<=len;i++){
			if(next[i]>0) 
				cur[i]+=cur[next[i]]+1;//想到这步就好了。
			else 
				cur[i]=1;
			sum+=cur[i];
		}
		printf("%lld\n",sum);
	}
	return 0;
	
}


posted @ 2014-06-20 18:23  kewowlo  阅读(156)  评论(0)    收藏  举报