hdu 3336 Count the string (KMP+DP)

题目大意:给你一个字符串,求所有前缀在原串的出现次数之和

打个表推推,KMP+DP随便水水就过了吧

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 200100
#define mod 10007
#define ui unsigned int
using namespace std;

int T,n,m,len;
int nxt[N];
ui f[N];
char s[N];
void clr()
{
    memset(f,0,sizeof(f));
    memset(s,0,sizeof(s));
    memset(nxt,0,sizeof(nxt));
}
void get_kmp()
{
    int i=0,j=-1;
    nxt[0]=-1;
    while(i<=len)
    {
        if(j==-1||s[i]==s[j])
        {
            i++;
            j++;
            nxt[i]=j;
        }else{
            j=nxt[j];
        }
    }
}
ui solve()
{
    ui ans=0;
    for(int i=1;i<=len;i++)
    {
        if(nxt[i]>=0) f[i]=f[nxt[i]]+1;
        else f[i]=1;
        f[i]%=mod;
        ans+=f[i];
        ans%=mod;
    }
    return ans;
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        clr();
        scanf("%s",s);
        len=strlen(s);
        get_kmp();
        printf("%u\n",solve());
    }
    return 0;
}

    
    

猜你喜欢

转载自blog.csdn.net/guapisolo/article/details/81740414