HDU3336 KMP之next数组妙用
2013-11-01 19:35
197 查看
本题要求所给字符串的前缀在整个字符串中出现的次数的累加和。KMP算法的运用。
容易联想到KMP算法中的next[]数组,当next[i]>0时可以理解为i前面的next[]个字符组成的字符串对应一个前缀。此外长度为n的字符串有n个前缀。
所以res等于n加上所有next值大于0的元素的个数。
例如:abab
那么他的前缀有a , ab ,aba , abab。
对应的在原串中的个数为a有2个,ab有2个,aba有1个,abab有1个。
那么总数是6。
思路:对这个字符串求出Next数组,那么对于每个Next[i] = k ,那么我们就知道前缀0 -> k - 1处有一个匹配。那么累加即可。
那么只需根据Next数组匹配成功的个数进行累加即可。
* This source code was highlighted byYcdoiT.
( style: Friend )
容易联想到KMP算法中的next[]数组,当next[i]>0时可以理解为i前面的next[]个字符组成的字符串对应一个前缀。此外长度为n的字符串有n个前缀。
所以res等于n加上所有next值大于0的元素的个数。
例如:abab
那么他的前缀有a , ab ,aba , abab。
对应的在原串中的个数为a有2个,ab有2个,aba有1个,abab有1个。
那么总数是6。
思路:对这个字符串求出Next数组,那么对于每个Next[i] = k ,那么我们就知道前缀0 -> k - 1处有一个匹配。那么累加即可。
那么只需根据Next数组匹配成功的个数进行累加即可。
/********************** * author:crazy_石头 * Pro:HDOJ 3336 * algorithm: KMP * Judge Status:Accepted * Memory:1246K * Time:46ms * date:2013/11/01 ***********************/ #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; #define rep(i,h,n) for(int i=(h);i<=(n);i++) const int maxn=200000+5; int next[maxn]; char p[maxn]; int n,test;//主串的串长; inline void getNext(char *p,int *next) { int i,j,m; i=0,j=-1; next[0]=-1; m=strlen(p); while(i<m) { if(j==-1||p[i]==p[j]) i++,j++,next[i]=j; else j=next[j]; } } int main() { scanf("%d",&test); while(test--) { scanf("%d",&n); scanf("%s",p); getNext(p,next); int res=n; rep(i,0,n) { if(next[i]>0) res=(res+1)%10007; } printf("%d\n",res); } return 0; } |
( style: Friend )
相关文章推荐
- Count the string---hdu3336(kmp Next数组的运用)
- KMP的妙用(利用next数组寻找字符串的循环节)
- HDU3336-Count the string-KMP(next数组理解)
- hdu3336解读KMP算法的next数组
- 【经典算法】——KMP,深入讲解next数组的求解
- 【经典算法】——KMP,深入讲解next数组的求解
- KMP中的next数组最通俗最详细的解析
- POJ_2752_KMP-next数组的应用
- kmp的next数组值得求法
- KMP--next数组的理解
- POJ 2185 KMP中next数组的应用
- poj 1961 Period [kmp, next数组的用法]
- HDU 3336 Count the string(KMP+Next数组递推)
- 【经典算法】——KMP,深入讲解next数组的求解
- KMP字符串快速匹配(next数组优化 有限状态自动机)
- Power Strings poj2406 (kmp 进阶 next数组使用)
- hdu3336解读KMP算法的next数组
- hdu1358 kmp的next数组
- KMP的next数组性质运用
- POJ-2752-Seek the Name, Seek the Fame(KMPnext数组应用)