【bzoj3670】动物园 kmp

来源:互联网 发布:虚拟机上装linux 编辑:程序博客网 时间:2024/04/29 16:18

AC通道: http://www.lydsy.com/JudgeOnline/problem.php?id=3670

【题解】
首先kmp求出p数组,顺便用num数组记录当前匹配的方法数,然后再做一次类似于kmp的东西,具体看代码
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<ctime>#include<cmath>#include<algorithm>using namespace std;#define mod 1000000007typedef long long ll;ll T,n,ans,p[1000100],num[1000100];char ch[1000100];void kmp(){    num[1]=1;    for(int i=2,j=0;i<=n;i++)    {        while(j&&ch[i]!=ch[j+1])  j=p[j];        if(ch[i]==ch[j+1])  j++;        p[i]=j;        num[i]=num[j]+1;    }    for(int i=2,j=0;i<=n;i++)    {        while(j&&ch[i]!=ch[j+1])  j=p[j];        if(ch[i]==ch[j+1])  j++;        while(j*2>i)  j=p[j];//如果重叠了,就往前找        ans=ans*(num[j]+1)%mod;    }}int main(){    freopen("zoo.in","r",stdin);    freopen("zoo.out","w",stdout);    scanf("%lld",&T);    while(T--)    {        scanf("%s",ch+1);        ans=1;  n=strlen(ch+1);  kmp();        printf("%lld\n",ans%mod);    }    return 0;}


 

 
 
 
 
 
 
 
 
 
1 0