hdu 3336 count the string

解释摘自网上。

题意:求给定字符串含前缀的数量

abab

前缀为

a

ab

aba

abab

abab中共有六个子串是前缀a a ab ab aba abab

所以答案为6

利用kmp中的匹配原理可以完美的解决此题

 a---------d-----

   -----a---------d

               i         j

如上所示,假设两串字符完全相等,next[j]=i,代表s[1...i]==sum[j-i+1....j],这一段其实就是前缀

设dp【i】:以string[i]结尾的子串总共含前缀的数量

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

#include <stdio.h>
#include <string.h>
int p[200100],ans[200100];
char b[200100];
int main()
{
    int cas;
    scanf("%d",&cas);
    int len;
    int i,j;
    while(cas--)
    {
        memset(ans,0,sizeof(ans));
        scanf("%d",&len);
        scanf("%s",b+1);
        j=0;
        p[1]=0;
        for(i=2;i<=len;i++)
        {
            while(j>0&&b[i]!=b[j+1]) j=p[j];
            if(b[i]==b[j+1])
                j++;
            p[i]=j;
        }
        ans[1]=1;
        int sum=1;
        for(i=2;i<=len;i++)
        {
            ans[i]=ans[p[i]]+1;
            sum=(sum+ans[i])%10007;
        }
        printf("%d\n",sum);
    }
    return 0;
}


 

posted @ 2014-06-06 16:44  贝尔摩德  阅读(153)  评论(0编辑  收藏  举报