hdu 3336 Count the string

我不是参考这里的,你们不要质疑我。

觉得上面说的很好。我只是想加一些自己的思考。

DP数组是记录的 以当前位置结尾的。

比如 ababab

当i=1时 此时就只有 a

当i=2时 此时只有 ab    但是ab串中也有a呀  为什么不要  因为上面说的是以 b结尾  所以最后一个一定要是b

当i=3时 此时 由 fail 数组可以得到  f【3】=1    也就是第一个a与第二个a匹配到了。所以加上ba串就是i=3 时候的前缀数

……

……

我已刻入灵魂

#include <iostream>
#include <cstdio>
#define MAXN 200005
using namespace std;

int m;
char P[MAXN];
int f[MAXN];
int dp[MAXN];
void getfail()
{
    //int m=strlen(P);
    f[0]=0;f[1]=0;
    for(int i=1;i<m;i++)
    {
        int j=f[i];
        while(j&&P[i]!=P[j])j=f[j];
        f[i+1]=P[i]==P[j]?j+1:0;
    }
}

/*int find()
{
    int n=strlen(T);
    int m=strlen(P);
    getfail();
    int j=0;
    for(int i=0;i<n;i++)
    {
        while(j&&P[j]!=T[i])j=f[j];
        if(P[j]==T[i])j++;
        if(j==m)printf("%d
",i-m+1);
    }
}
*/
int main()
{
    int CASE;
    scanf("%d",&CASE);
    while(CASE--)
    {
        scanf("%d",&m);
        scanf("%s",P);
        getfail();
        dp[0]=0;
        dp[1]=1;
        int sum=1;
        for(int i=2;i<=m;i++)
        {
            dp[i]=dp[f[i]]+1;
            sum=(sum+dp[i])%10007;
            //printf("%d ",dp[i]);
        }
        cout<<sum<<endl;
    }
}


原文地址:https://www.cnblogs.com/javawebsoa/p/3249194.html