hud3336 kmp之对next数组的利用
2016-08-05 11:41
225 查看
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336
题意:给一串字符串,问这串字符串所有的前缀总共在这个字符串中出现了几次。
举个例子:字符串abab。a出现了2次,ab出现了2次,aba1次,abab1次,总共6次。
准备工作 : 解这道题就要对kmp算法中的next[] 数组有着深刻的理解,如字符串str的next[i] = j。就代表 str中j-i+1这个字符串和0-j这个字符串相等
解题思路 : 将字符串所有的前缀0-i在i+1-n出现的次数相加得到 sum, sum再加上n就是了(共有n个字符串)。
题意:给一串字符串,问这串字符串所有的前缀总共在这个字符串中出现了几次。
举个例子:字符串abab。a出现了2次,ab出现了2次,aba1次,abab1次,总共6次。
准备工作 : 解这道题就要对kmp算法中的next[] 数组有着深刻的理解,如字符串str的next[i] = j。就代表 str中j-i+1这个字符串和0-j这个字符串相等
解题思路 : 将字符串所有的前缀0-i在i+1-n出现的次数相加得到 sum, sum再加上n就是了(共有n个字符串)。
#include <stdio.h> #include <string.h> #define N 200000+100 void nextMake(const char *p,int *next); void kmp(const char *T,const char *p,int *next); char str1 ,str2 ; int sum,next ,dp ; int main() { int t,n,i,j; scanf("%d",&t); while(t--) { sum = 0; scanf("%d %s",&n,str1); nextMake(str1,next); n = strlen(str1); for(i=0; i<n; i++) { /*比如str=abab这个字符串,next[3] = 2,不就是就表示与 缀在str[i-n-1]找到了一个匹配吗,所以sum += 1*/ if(next[i] != 0) sum = (sum+1)%10007; } printf("%d\n",(sum+n)%10007); } return 0; } void nextMake(const char *p,int *next) { int k,q; int m = strlen(p); next[0] = 0; for(q=1,k=0; q<m; q++) { while(k>0 && p[q]!=p[k]) k = next[k-1]; if(p[k] == p[q]) { k++; } next[q] = k; } }
相关文章推荐
- HDU Cyclic Nacklace (KMP-next数组的利用)
- POJ 2752+KMP+利用next数组性质求出所有相同的前缀和后缀
- KMP的妙用(利用next数组寻找字符串的循环节)
- CF 126B Password (KMP,利用next数组)
- 利用kmp里的next数组的一道题
- LA 3026 && POJ 1961 Period (利用kmp中的next数组找最小的循环节 )
- HDU 3746 Cyclic Nacklace 利用 KMP的next数组求循环节
- poj 2406 Power Strings (kmp 中 next 数组的应用||后缀数组)
- KMP的next[]数组详解
- HDOJ-3746 利用KMP的fail数组
- poj-2406 kmp中的next数组应用
- POJ 2572(Seek the Name, Seek the Fame) KMP中next数组的应用
- KMP算法利用next数组消除回溯思考
- 【经典算法】——KMP,深入讲解next数组的求解
- kmp的next数组求法
- 如何利用KMP的next求字符串的循环节
- kmp的next数组值的求法
- POJ 2185 KMP中next数组的应用
- KMP及其next数组性质学习小记 Poj1961 Period
- hdu1358 利用next【】数组求重复前缀