Hdu 3336 Count the string (KMP+DP 前缀出现次数和)

本是古典 何须时尚 2022-08-27 11:43 69阅读 0赞

题意:给一个字符串,对每一个前缀出现的次数求和。

这里有另外一种思路:【KMP】HDU 3336 Count the string - KIDxの博客 - ITeye技术网站

  1. #include <cstdio>
  2. #include <cstring>
  3. const int MOD=10007;
  4. const int N=200005;
  5. char s[N];
  6. int next[N],n,f[N];
  7. void getNext(char s[],int len)
  8. {
  9. next[0]=-1;
  10. int i=0,j=-1;
  11. while (i<len)
  12. {
  13. if (j==-1 || s[i]==s[j])
  14. next[++i]=++j;
  15. else j=next[j];
  16. }
  17. }
  18. int DP ()
  19. {
  20. int ans=0;
  21. memset(f,0,sizeof(f));
  22. for (int i=1;i<=n;i++)
  23. {//f[i]表示长度为i的字符串(也就是把str[i]当成'\0')总共含前缀的数量
  24. f[i]=f[next[i]]+1;//+1表示长度为next[i]的前缀在当前结尾又出现了一次
  25. ans=(ans+f[i])%MOD;
  26. }
  27. return ans;
  28. }
  29. int main ()
  30. {
  31. int T;
  32. scanf("%d",&T);
  33. while (T--)
  34. {
  35. scanf("%d",&n);
  36. scanf("%s",s);
  37. getNext(s,n);
  38. printf("%d\n",DP());
  39. }
  40. return 0;
  41. }

发表评论

表情:
评论列表 (有 0 条评论,69人围观)

还没有评论,来说两句吧...

相关阅读