记录编号 414517 评测结果 AAAAAAAAAA
题目名称 [NOI 2014]动物园 最终得分 100
用户昵称 Gravatar~玖湫~ 是否通过 通过
代码语言 C++ 运行时间 0.337 s
提交时间 2017-06-14 15:23:45 内存使用 8.89 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define mod 1000000007
const int M=1000000;
int t,last[M+10],num[M+10],len;
long long ans=1;
char s[M+10];
void getfail(){
     last[0]=last[1]=0;
     num[0]=-1;
     for(int i=2,k=0;i<=len;i++){
       while(k&&s[k]!=s[i-1]) k=last[k];
       if(s[k]==s[i-1]) k++;
       last[i]=k;
       num[i]=num[k]+1;
     }
}
long long getans(){
     for(int i=2,k=0;i<=len;i++){
       while(k&&s[k]!=s[i-1]) k=last[k];
       if(s[k]==s[i-1]) k++;
       while(k>(i>>1))
          k=last[k];
       ans=ans*(num[k]+2)%mod;
     }
     return ans;
}
int main(){
    freopen("zoo.in","r",stdin);
    freopen("zoo.out","w",stdout); 
    scanf("%d",&t);
    while(t--){
      ans=1;
      scanf("%s",s);
      len=strlen(s);
      getfail();
      printf("%lld\n",getans());
    }
    //while(1);
    return 0;
}