题目链接: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]开头的前
在IT行业中,"Number Sequence"通常指的是在特定系统或应用中用于生成自动递增或递减的数字序列。这些序列可以用于唯一标识记录、订单号、发票号等,确保数据的唯一性和可追踪性。在Microsoft Dynamics AX(现称为...
HDU ACM代码集合是针对ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)的一份资源,这个压缩包中的代码涵盖了多种算法,是参赛者或对算法学习感兴趣的人宝贵的参考资料。ACM竞赛旨在...
在ACM(国际大学生程序设计竞赛)中,HDU(杭州电子科技大学)的在线判题系统是许多参赛者磨炼算法技巧的重要平台。这个平台涵盖了众多的算法问题,旨在提升参赛者的编程能力和逻辑思维能力。以下是对标题和描述中...
HDU算法讲解的PPT是一份非常有价值的教育资源,由知名教育机构HDU(杭州电子科技大学)的lcy老师精心制作并讲解。这份PPT涵盖了算法的各个方面,是学习和提升算法能力的理想材料。标签“算法”、“讲解”和“经典”...
HDU(杭州电子科技大学)的ACM算法课件是一份宝贵的学习资源,旨在提升程序员的算法思维和解题能力。ACM,全称国际大学生程序设计竞赛(International Collegiate Programming Contest),是全球范围内的一项权威性...
根据提供的信息,我们可以总结出以下关于“hdu动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...
4. **字符串处理**:KMP算法、Manacher's Algorithm、Rabin-Karp算法等。 5. **数学应用**:组合数学、数论(质因数分解、模运算、欧几里得算法等)、概率论等。 6. **编码技巧**:IO优化(如scanf/printf代替cin/...
- **【HDU 3488】Tour 最小费用圈覆盖**、**【HDU 3435】A new Graph Game**、**【HDU 3722】Card Game**、**【HDU 3718】Similarity 求相似度**:这些题目虽然不是直接与KMP算法相关,但标签中的“最小费用圈覆盖”...
acm 技术大牛 课件 HDU 自学必备课件 全套齐全 (lecture_01)初识ACM (lecture_02)简单数学题 (lecture_03)递推求解 (lecture_04)动态规划(1)_ (lecture_05)计算几何基础_ (lecture_06)母函数 (lecture_...
杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题
3. **字符串处理**:杭电ACM中的题目可能涉及到字符串匹配(KMP算法、Boyer-Moore算法)、编码解码、模式查找等问题,熟悉字符串操作是必备技能。 4. **数学应用**:很多ACM题目需要应用到基础数学知识,例如数论...
**Dijkstra算法解HDU1874** Dijkstra算法是一种经典的图论算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。在这个问题中,我们需要从一个指定的起点(源节点)出发,找到...
6. **字符串处理**:模式匹配、KMP算法、Manacher's Algorithm等。 7. **模拟法**:直接按照题目描述进行程序模拟,解决一些逻辑性较强的问题。 学习和理解ACM HDU的题解,不仅可以提升编程能力,还能帮助我们理解...
6. **字符串处理**:KMP匹配、Z算法、后缀数组、AC自动机等。 通过分析和理解这些代码,你可以提升自己的算法思维,学习如何高效地解决问题,这对于参加ACM竞赛或者日常的编程工作都非常有益。同时,也可以借鉴代码...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...
贪心算法是一种常用的算法思想,在 ACM HDU 题目分类中,贪心算法也占据了一定的比例。例如,1009 贪心;1050 贪心;1052 贪心;1053 贪心,关于 Huffman 编码 等等。 数学题 数学题是 ACM HDU 题目分类中的一大类...
在竞赛编程中,字符串问题可能涉及到KMP算法、Manacher's Algorithm(曼哈顿算法)或者Rabin-Karp滚动哈希等技术,用于高效地处理字符串的匹配和操作。 4. **动态规划(DP)**:动态规划是一种解决问题的系统方法,...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...