kmp

kmp 和boyer-moore

可紊 提交于 2020-04-08 12:26:02
<html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Visualizing String Matching Algorithms</title> <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script> <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> <script src="javascript/strmatch.js"></script> <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet"> <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.1/js/bootstrap.min.js"></script> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i

学习:字符串----KMP算法

限于喜欢 提交于 2020-04-07 20:42:40
KMP算法 是判断一个字符串 (模式串) 是不是另一个字符串 (文本串) 的子串的常用算法,其中KMP算法的失配指针的概念(在本算法也叫 next数组 )在AC自动机中也有突出使用。 朴素的字符串匹配算法 朴素的字符串匹配算法,即判断文本串的 以每一个字符为开头,与模式串等长的子字符串 是否与 模式串 本身相等。很明显复杂度为为 O(mn),其中m为文本串的长度,n为模式串的长度。具体实现如下图 上图是一个字符串朴素匹配的示意图,长度为4的模式串与文本串每一个连续的长度为4的子串进行匹配判断,每一次匹配判断都需要一个个字符比较。 朴素匹配的代码: int StringMatch(string s, string p){ //s为文本串,p为模式串 int sLen = s.size(); int pLen = p.size(); int i = 0; //i遍历文本串下标,j遍历模式串下标 int j = 0; while (i < sLen && j < pLen){ if (s[i] == p[j]){ //相同i和j一起加1 i++; j++; } else{ i = i - j + 1; //i指向文本串下一个子串的第一个字符。 j = 0; //不相同,j重新指向模式串第一个字符 } } if (j == pLen) return i - j; else return

POJ Blue Jeans [枚举+KMP]

依然范特西╮ 提交于 2020-04-07 07:45:07
传送门 F - Blue Jeans Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Description The Genographic Project is a research partnership between IBM and The National Geographic Society that is analyzing DNA from hundreds of thousands of contributors to map how the Earth was populated. As an IBM researcher, you have been tasked with writing a program that will find commonalities amongst given snippets of DNA that can be correlated with individual survey information to identify new genetic markers. A DNA base sequence is noted by listing the nitrogen bases in the

KMP,Trie,AC自动机题目集

放肆的年华 提交于 2020-04-06 08:47:44
字符串算法并不多,KMP,trie,AC自动机就是其中几个最经典的。字符串的题目灵活多变也有许多套路,需要多做题才能体会。这里收集了许多前辈的题目做个集合,方便自己回忆。 KMP题目: https://blog.csdn.net/qq_38891827/article/details/80501506 Trie树题目: https://blog.csdn.net/qq_38891827/article/details/80532462 AC自动机:模板 https://www.luogu.org/blog/42196/qiang-shi-tu-xie-ac-zi-dong-ji AC自动机题目集: https://www.cnblogs.com/kuangbin/p/3164106.html KMP: LuoguP3375 KMP模板 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1000000+10; char a[N],b[N]; int n,m,nxt[N],f[N],g[N]; void get_next() { nxt[1]=0; for (int i=2,j=0;i<=n;i++) { while (j>0 && a[j+1]!=a[i]) j

(kmp)poj 3080 ——Blue Jeans

旧时模样 提交于 2020-04-05 23:04:35
The Genographic Project is a research partnership between IBM and The National Geographic Society that is analyzing DNA from hundreds of thousands of contributors to map how the Earth was populated. As an IBM researcher, you have been tasked with writing a program that will find commonalities amongst given snippets of DNA that can be correlated with individual survey information to identify new genetic markers. A DNA base sequence is noted by listing the nitrogen bases in the order in which they are found in the molecule. There are four bases: adenine (A), thymine (T), guanine (G), and

poj 3080 Blue Jeans(kmp)

旧街凉风 提交于 2020-04-05 22:24:48
poj 3080 PKU 3080 Blue Jeans(kmp)?#include<stdio.h>#include<string.h>const int N=100;int n,m,next[N];char dna[N][N];void get_next(char *str,int len){ next[0]=-1; int j=0,k=-1;//k记录next[]; while(j<len) { if(k==-1||str[j]==str[k]) { k++; j++; if(str[k]!=str[j]) next[j]=k; else next[j]=next[k]; } else k=next[k]; }}int kmp(char *s,int slen){ get_next(s,slen); int f=0,j,k,i; for(i=1;i<m;i++) { int k=0, j=0; int len=strlen(dna[i]); while(j<len&&k<slen) { if(k==-1||s[k]==dna[i][j]) { j++; k++; } else k=next[k]; } if(k<slen)break; } if(i==m)return 1; else return 0;} int main(){ int i,j,k,sum,max=-1;

kmp

邮差的信 提交于 2020-04-04 19:02:48
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 42846 Accepted Submission(s): 17687 Problem 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]. If there are more than one K exist, output the smallest one. Input The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two

POJ3461 Oulipo KMP算法

前提是你 提交于 2020-03-30 13:05:38
这个算法去年的这个时候就已经听过了,看毛片算法哈哈..不过理解它确实花了我很久的时间..以致于我一直很排斥字符串的学习,因为总觉得太难了,但是有些硬骨头还是要啃的,这个寒假就啃啃字符串还有一些别的东西吧,KMP的学习我看了好多好多博客才有那么些头绪,复杂度的分析更是无从谈起,不过线性匹配这样的算法实在太流弊了.~题目是水题,但也算是我的第一道KMP吧.~ #include<iostream> #include<cstring> #include<string> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #define mxt 1000005 #define mxp 10005 #define inf 0x3f3f3f3f int f[mxp+50]; char T[mxt+50]; char P[mxp+50]; void getFail(const char *P,int *f) { int m=strlen(P); f[0]=f[1]=0; for(int i=1;i<m;++i){ int j=f[i]; while(j&&P[i]!=P[j]) j=f[j]; f[i+1]= P[i]==P[j]? j+1:0; } } int KMP(const char *P

19-字符串匹配(kmp || substr,find)

。_饼干妹妹 提交于 2020-03-29 02:57:33
链接: https://www.nowcoder.com/acm/contest/77/C 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 有一个字符串 让你找到这个字符串 S 里面的子串T 这个子串 T 必须满足即使这个串的前缀 也是这个 串的后缀 并且 在字符串中也出现过一次的(提示 要求满足前后缀的同时也要在字符串中出现一次 只是前后缀可不行 输出最长满足要求字符串) 输入描述: 给出一个字符串 长度 1 到 1e6 全部是小写字母 输出描述: 如果找的到就输出这个子串T 如果不行就输出 Just a legend 示例1 输入 fixprefixsuffix 输出 fix 示例2 输入 abcdabc 输出 Just a legend方法一:kmp:注意枚举的模式串,以及原串与给定字符之间的差别: #include <iostream> #include <cstring> #include <cstdio> using namespace std; string str, mo; int Next[1000005]; void getNext(){ Next[0] = -1; //一定要初始化 int i = 0, j = -1, len = mo

时间复杂度O()与KMP算法

爷,独闯天下 提交于 2020-03-28 17:49:36
要得到某个结果,可以有很多种方式,算法就是为了寻找一条最快的方式。 而评判其好坏的标准就是时间复杂度。 O(1):   我们把执行一次的时间复杂度定义为O(1)   sum = a +b;   cout << sum <<endl; O(n):   for(int i = 0; i < n ;++n)   {       //do something.   } O(n2): for(int i = 0; i < n ;++n)   {      for(int j = 0; j < n ;++n)     {       //do something.     }   } 我们会碰到这样的需求,从一个主字符串中找到一个子串,首先我们想到的是这种方法: #include "stdafx.h" #include<iostream> #include<string> using namespace std; int findString(string S,string T) { int i = 0; int j = 0; while(i<S.length() && j < T.length()) { if(T[j] == S[i]) { i++; j++; } else { j=0; i = i-j+1; } } if(j = T.length()) { return i-j; }