记录编号 461293 评测结果 AAAAAAAAAA
题目名称 [NOI 2014]动物园 最终得分 100
用户昵称 GravatarHzoi_Ivan 是否通过 通过
代码语言 C++ 运行时间 0.355 s
提交时间 2017-10-19 19:29:42 内存使用 8.90 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define mod 1000000007
#define N 1000500
using namespace std;
int nxt[N],n,num[N],ans;
char a[N];
void getnext(){
	nxt[0]=-1; num[0]=1;
	for(int i=1,j=-1;i<n;i++){
		while(~j&&a[i]!=a[j+1])j=nxt[j];
		if(a[i]==a[j+1])j++;nxt[i]=j;
		if(j<0)num[i]=1;
		else num[i]=num[j]+1;
	}
	/*for(int i=0;i<n;i++)
		printf("%d  %d  %d\n",i,nxt[i],num[i]);*/
	ans=1;
	for(int i=1,j=-1;i<n;i++){
		while(~j&&a[i]!=a[j+1])j=nxt[j];
		if(a[i]==a[j+1])j++;
		while(~j&&(j+1)*2>(i+1))j=nxt[j];
		if(j>=0)ans=(1ll*ans*(num[j]+1))%mod;
	}
	printf("%d\n",ans);
}
int main(){
	freopen("zoo.in", "r", stdin);
	freopen("zoo.out", "w", stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%s",a);
		n=strlen(a);
		getnext();
	}
	return 0;
}
/*
3
aaaaa
ab
abcababc
*/