KMP Hdu-3336 Count the string

来源:互联网 发布:网页禁止注入js脚本 编辑:程序博客网 时间:2024/05/21 08:58

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3336

题目意思:

求一个字符串的所有前缀出现次数的总和。

以前做的一道题目,没想到,金山的比赛居然有一模一样的题。

http://acm.hdu.edu.cn/showproblem.php?pid=4552

解题思路:

dp[i]表示以i结尾的前缀的个数。

dp[i]=dp[next[i]]+1.

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<stack>#include<list>#include<queue>#define eps 1e-6#define INF (1<<30)#define PI acos(-1.0)using namespace std;#define Maxn 220000#define mod 256int next[Maxn],dp[Maxn];char save[Maxn];int n;void getnext(){   int j=0;   next[1]=0;   for(int i=2;i<=n;i++)   {      while(j>0&&save[j+1]!=save[i])         j=next[j];      if(save[j+1]==save[i])         j++;      next[i]=j;   }   return ;}int main(){   int t;   scanf("%d",&t);   while(t--)   //while(scanf("%s",save+1)!=EOF)   {     // save[0]='k';      //n=strlen(save)-1;      scanf("%d%s",&n,save+1);      getnext();      int ans=0;      dp[0]=0;      for(int i=1;i<=n;i++)      {         dp[i]=(dp[next[i]]+1)%mod;         ans=(ans+dp[i])%mod;      }      printf("%d\n",ans);   }   return 0;}