kmp多次匹配

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int ans=0,i,j,ls,lp,next[10001];
 5 string s,p;
 6 int main()
 7 {
 8     ios::sync_with_stdio(false);
 9     //cin>>ls>>lp>>s>>p;
10     cin>>s>>p;ls=s.length();lp=p.length();
11     i=0,j=-1;
12     next[0]=-1;
13     while(i<lp)//因为目标S中所含的几个模式P之间可能有重叠部分,所以还需要计算所有字符都匹配时的next
14         if(j<0||p[i]==p[j])
15         {
16             i++;j++;
17             if(p[i]!=p[j]) next[i]=j;else next[i]=next[j];
18         }else j=next[j];
19     i=0,j=0;
20     while (i<ls)
21     {
22         if (j<0||s[i]==p[j]) {i++;j++;}else j=next[j];
23         if (j==lp) {ans++;j=next[j];}
24     }
25     cout<<ans<<endl;
26 }
时间: 2024-10-12 11:32:57

kmp多次匹配的相关文章

KMP入门(匹配)

Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M].

学习记录---KMP算法-部分匹配表理解

如需转载,请保留本文链接. 看了 阮一峰 大神的字符串匹配的KMP算法后,关于部分匹配的部分并不是很理解,特意去看了阮大神文章中的英文链接,这里写下自己的理解,用作学习记录. 阮大神文章链接:https://kb.cnblogs.com/page/176818/ Jake Boxer 英文博文链接:http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/ 关于前缀和后缀的定义,这里

Oulipo POJ - 3461(kmp,求重叠匹配个数)

Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter'e'. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair

kmp单次匹配

1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int i,j,ls,lp,next[10000]; 5 string s,p; 6 int main() 7 { 8 ios::sync_with_stdio(false); 9 //cin>>ls>>lp>>s>>p; 10 cin>>s>>p;ls=s.length();

剪花布条 HDU - 2087(kmp,求不重叠匹配个数)

Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样.花纹条和小饰条不会超过1000个字符长.如果遇见#字符,则不再进行工作. Output 输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出

从头到尾彻底理解KMP

从头到尾彻底理解KMP 本文转自:http://blog.csdn.net/v_july_v/article/details/7041827 作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进.后收录于新书<编程之法:面试和算法心得>第4.4节中. 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱.所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终不够

扩展KMP - HDU 4333 Revolving Digits

Revolving Digits Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=4333 Mean: 给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于.等于.大于原串. analyse: KMP的经典题. 首先我们将原串扩展成两倍,算一遍扩展KMP(自匹配),时间复杂度O(n). 这样一来,我们就得到了eKMP[i],eKMP[i]代表s[i...len-1]与s的最长

【KMP原理】【整理回顾】

今儿套KMP模板做了个题,敏敏找我讲next[]数组的时候把我问懵了.具体原理都记不清了光靠模板凑得了一时凑不了一世啊,所以再捋一捋顺一顺,这次印象要深刻一点了: KMP与暴力匹配的优化区别就不再提了,O(m+n)的复杂度已经完胜了,直接进入正题... 以下言论均是总结自该同学的,是不是原创我不清楚,链接反正是给你们吧... 匹配串S,模式串T: 首先是KMP的精华所在,next[]数组 next[i]=k的意思为:T[i]前面有k个字符和字符串T的前k个字符相同,且T[i]不等于开始的k个字符

KMP专题

1.HDU 1711 Number Sequence 题意:给出两个数字串a,b,问能否使得数字串b为a的子串,能输出最小的匹配位置. 思路:KMP模板题 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int maxn = 1000010; 5 const int maxm = 10010; 6 int p[maxm]; 7 int des[maxn]; 8 int Next[maxm