现在的位置: 首页 > 综合 > 正文

hdu 3336 Count the string

2018年12月28日 ⁄ 综合 ⁄ 共 478字 ⁄ 字号 评论关闭

求字符串的所有前缀在字符串中出现的次数之和

next[i]=j;

dp[j]:以s[j]结尾的子串总共含前缀的数量

dp[i]=1+dp[next[i]]: 以i结尾的子串中含前缀的数量加上前j个字符这一前缀




#include<stdio.h>
#include<string.h>
#define N 200002
int dp[N],next[N],n;
char s[N];
void get()
{
    next[1]=0;
    int i,j=0;
    for(i=2;i<=n;i++)
    {
        while(j>0&&s[i]!=s[j+1])
            j=next[j];
        if(s[i]==s[j+1])
            j++;
        next[i]=j;
    }
}
int main()
{
    int i,j;
    scanf("%d",&j);
    while(j--)
    {
        scanf("%d",&n);
        scanf("%s",s+1);
        get();
        dp[0]=0;
        int sum=0;
        for(i=1;i<=n;i++)
        {
            dp[i]=dp[next[i]]+1;
            sum=(sum+dp[i])%10007;
        }
        printf("%d\n",sum);
    }
    return 0;
}

抱歉!评论已关闭.