hdu 3336 Count the stringkmp
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 3336 Count the stringkmp相关的知识,希望对你有一定的参考价值。
http://acm.hdu.edu.cn/showproblem.php?pid=3336
题意:给你一个字符串,问字符串每一个前缀在字符串中的出现总次数。
思路:kmp的应用,自身和自身进行匹配,每次匹配时,如果没有匹配到结束,模式串按next数组向后移动,出现匹配至结束的情况,匹配串往后移动一位
,匹配过程中,出现失配时,统计当前已经匹配的字符个数,累加到总数中,直到匹配串移动到最后一位。
其实前两天就在网上看题解用kmp+dp的方法来写了这道题,然而后来细思一些细节,自己并没有弄懂,所以,我就没有写成题解,最后,还是我师父出面,把这道题给解释了
#include<stdio.h> #define N 200010 #define mod 10007 int next[N]; char str[N]; void Get_next(int n) { int j ,k; j = 0; next[j] = k = -1; while(j <= n) { if(k == -1||str[j] ==str[k]) next[++j] = ++k; else k = next[k]; } return; } int KMP(int n) { int i,j,k; i = 1; j = k = 0; while(i <= n) { if(j == -1||str[i]==str[j]) { i++; j++; } else//失配时 { k += j;//每次累加起点不同匹配的字符串长度,保证了起点不重复 k%=mod; j = next[j]; } } return k ; } int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); getchar(); scanf("%s",str); Get_next(n); printf("%d\n",(KMP(n)+n)%mod); } return 0; }
以上是关于hdu 3336 Count the stringkmp的主要内容,如果未能解决你的问题,请参考以下文章