1. 程式人生 > >[bzoj3670] [NOI2014][lg2375] 動物園

[bzoj3670] [NOI2014][lg2375] 動物園

cnblogs void char next數組 color string pac sca %d

nxt數組為KMP的next數組
num[i]儲存了i前面可以匹配的串的個數。
先在KMP求nxt中順便求出num
最後再找到對於i的最大的前後綴不重疊的可匹配的j,ans*=(num[j]+1)%1000000007
ans即為答案
 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 char s[1000100];
 5 int nxt[1000100],num[1000100],n;
 6 long long ans;
 7 void doit(char *s){
 8     int n=strlen(s);
 9     nxt[0
]=-1; 10 nxt[1]=0; 11 num[0]=0; 12 num[1]=1;ans=1; 13 for(int i=1,j=0;i<n;i++){ 14 while(j>=0&&s[i]!=s[j])j=nxt[j]; 15 nxt[i+1]=++j; 16 num[i+1]=num[j]+1; 17 } 18 for(int i=1,j=0;i<n;i++){ 19 while(j>=0&&s[i]!=s[j])j=nxt[j];
20 j++; 21 while((j<<1)>(i+1))j=nxt[j]; 22 ans=(ans*((long long)num[j]+1))%1000000007; 23 } 24 printf("%lld\n",ans); 25 } 26 int main(){ 27 scanf("%d",&n); 28 while(n--){ 29 scanf("%s",s); 30 doit(s); 31 } 32 }

[bzoj3670] [NOI2014][lg2375] 動物園