题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
解题报告:一道比较简单的kmp题目,还是很佩服当初发明者个算法的一群人,怎么想到的next数组的写法,让我们这帮菜鸟反复理解其含义。不知道为什么这么写,但我们至少要理解next的含义。
首先:next[0]=-1 ,是我们规定的每个串的第一个值为-1;
其次: next[j]=-1,这儿有两种可能。
第一,第j个元素的值和第一个元素的值相等 且 J前面的k个元素与前1~k个元素不相等。
第二,前面的1~k个元素与j前面的k个元素相等,但是next[j]==next[k]。
如abcabcad中next[6]=-1,因为a[3]=a[6] ;
再次:next[j]=k的情况。前面的1~k个元素与j前面的k个元素相等,但是next[j]!=next[k]。
最后:next[j]=0:除了上述的三种情况。
#include<cstdio> #include<cstring> using namespace std; const int MAX2 = 10000+5; const int MAX1 = 1000000+5; int n,m; int next[MAX2],b[MAX2],a[MAX1]; void get_next() { int j=-1,i; next[0]=-1; for(int i=1;i<=m;i++) { while(j>-1&&b[j+1]!=b[i]) { j=next[j]; } if(b[j+1]==b[i]) j++; next[i]=j; } } int KMP() { get_next(); int j=-1,cnt=0,i,pos=0; for(int i=0;i<n;i++) { while(j>-1&&b[j+1]!=a[i]) { j=next[j]; } if(b[j+1]==a[i]) j++; if(j==m-1) { pos=i; cnt=j; break; } } if(pos != 0) return pos-cnt+1; return -1; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d %d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int j=0;j<m;j++) scanf("%d",&b[j]); int ans = KMP(); printf("%d\n",ans); } return 0; }
相关推荐
HDU-1711 Number Sequence(KMP算法)For each test case, you should output one line wh
next[i]的含义是在str[i]之前的字符串str[0...i]中,必须以str[i-1]结尾的后缀子串(不能包含str[0])与必须以str[0]开头的前
hdu ACM代码 每种算法都有分类 大三了,没有时间弄ACM,这些要删了
HDU的ACM,非常的好 涉及了很多算法,例如二分匹配、博弈、组合、最小生成树、搜索、动态规划、贪心算法
hdu动态规划算法集锦
很实用的算法讲解,hdu的lcy老师讲解,还不错!!
acm 技术大牛 课件 HDU 自学必备课件 全套齐全 (lecture_01)初识ACM (lecture_02)简单数学题 (lecture_03)递推求解 (lecture_04)动态规划(1)_ (lecture_05)计算几何基础_ (lecture_06)母函数 (lecture_...
杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题
杭电ACM 培训课件,包括各种常用的算法,并结合例题详细的讲解,对提高算法思想用很大帮助
算法-数塔(HDU-2084).rar
八数码的A*算法~不是很高效,但是很适合刚刚学这个算法的朋友们
【hdu5306】Gorgeous Sequence 线段树区间最值操作-附件资源
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
算法设计与分析实验六:使用动态规划算法解决存钱问题(java实现、hdu1114)(csdn)————程序
算法-超级楼梯(HDU-2040)(包含源程序).rar
杭电ACMhdu1163
HDU1059的代码
算法-六度分离(HDU-1869)(包含源程序).rar
hdu1001解题报告
hdu 1574 passed sorce