P2375

首先,这题最好的一个地方,在于它给出的关于next的讲解实在是妙极!!!!!
这题比我讲的好100倍!
赞美lg
捧lg的话到此为止,进入正文
题解

#include<bits/stdc++.h>
using namespace std;
const long long MOD=1e9+7;
int n,fail[1000010],ans[1000010];
long long cnt;
char a[1000010];
int main() {
	int T,i,j;
	scanf("%d",&T);
	while(T--) {
		scanf("%s",a);
		n=strlen(a);
		memset(fail,0,sizeof(fail));
		j=0;
		ans[0]=0;
		ans[1]=1;
		for(i=1; i<n; i++) {
			while(j&&(a[i]!=a[j])) j=fail[j];
			j+=(a[i]==a[j]);
			fail[i+1]=j;
			ans[i+1]=ans[j]+1;
		}
		j=0;
		cnt=1;
		for(i=1; i<n; i++) {
			while(j&&(a[i]!=a[j])) j=fail[j];
			j+=(a[i]==a[j]);
			while((j<<1)>(i+1)) j=fail[j];
			cnt=(cnt*(long long)(ans[j]+1))%MOD;
		}
		printf("%lld\n",cnt);
	}
}
posted @ 2024-10-22 14:16  yzc_is_SadBee  阅读(1)  评论(0编辑  收藏  举报