kmp字符串匹配基础模板题 (洛谷P3375 )

如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。

为了减少骗分的情况,接下来还要输出子串的前缀数组next。如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。

输入样例#1:

ABABABC
ABA

输出样例#1:

1
3
0 0 1 因为要求next的值,所以这里不加优化了把代码进行稍微的改动标记即可
#include<bits/stdc++.h>
using namespace std;

int next[2000000];
char s[2000000],p[2000000];
int  answer[200000];
int top=0;

void Getnext()
{
	 int len=strlen(p);
	 next[0]=-1;
	 int    k=-1,j=0;
	 while(j<len)//注意下标
	 {
	      //p[k]表示前缀,p[j]表示后缀
		  if(k==-1||p[j]==p[k])
	      {
		     k++;j++;
		    // if(p[j]!=p[k])
		        next[j]=k;
		     //else//因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]
		      // next[j]=next[k];
		  }
		  else k=next[k];
	 }
}

int kmp()
{
	int i=0,j=0;
	int lens=strlen(s),lenp=strlen(p);
	while(i<lens&&j<lenp)
	{
	    if(j==-1||s[i]==p[j])
	     {
		   i++;
		   j++;
		 }
		 else j=next[j];//相当于模式串向右移动
		 if(j==lenp)
		 {
            cout<<i+1-j<<endl;
		   j=next[j];//将后缀转化为前缀
		 }
	}

}

int main()
{
	scanf("%s%s",s,p);
	Getnext();
	kmp();
	for(int i=1;i<=strlen(p);i++)
	  cout<<next[i]<<" ";
   return 0;
}

  

时间: 2024-11-08 19:19:34

kmp字符串匹配基础模板题 (洛谷P3375 )的相关文章

【luogu P3375 KMP字符串匹配】 模板

题目链接:https://www.luogu.org/problemnew/show/P3375 实际上KMP是一种自己匹配自己的模式.好好理解qaq #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1000001; char a[maxn], b[maxn]; int nex

洛谷P3375 [模板]KMP字符串匹配

To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整

洛谷 P3375 【模板】KMP字符串匹配 || HDU 1686 Oulipo || kmp

HDU-1686 P3375 kmp介绍: http://www.cnblogs.com/SYCstudio/p/7194315.html http://blog.chinaunix.net/uid-8735300-id-2017161.html(mp&kmp) http://www-igm.univ-mlv.fr/~lecroq/string/node8.html(mp&kmp,看上去很正确的例程) http://blog.csdn.net/joylnwang/article/detai

Luogu P3375 【模板】KMP字符串匹配

P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了. 输入输出格式 输入格式: 第一行为一个字符串,即为s1(仅包含大写字母) 第二行为一个字符串,即为s2(仅包含大写字母) 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整数

P3375 模板 KMP字符串匹配

P3375 [模板]KMP字符串匹配 来一道模板题,直接上代码. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 5; int n, m; char s1[N], s2[N]; int nxt[N] ; void Get_next(char *s) { int j, L = strlen(s + 1); nxt[1] = j = 0; for(int i = 2; i

KMP字符串匹配

1 #include<iostream> 2 3 4 using namespace std; 5 6 #define MAX 255 7 8 typedef unsigned char BYTE; 9 10 typedef BYTE String[MAX+1]; 11 12 bool strAssign(String& strTemp,char* Temp); //定长字符串存储 13 bool strTravel(String& strTemp); //打印 14 void

【模板】KMP字符串匹配【KMP】

题目大意: 给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 思路: KMP算法模板题. KMP这个算法一开始真的很难懂,但是接触后过一会再研究就会豁然开朗.这个东西也很难解释原理,只有自己搞懂. 推荐的KMP讲解:https://blog.csdn.net/starstar1992/article/details/54913261/ 时间复杂度O(n),暴力时间复杂度O(n×m) 代码: #include <cstdio> #include <iostr

网络流最大流模板(洛谷3376)——Dinic

小道消息,据说NOIP 2017 的六个题是三位(前?)国家队大神出的,所以难度很有可能贼高,并且可能出现网络流,所以慌慌张张地来打了个Dinic 模板,但愿汝佳所说“在大多数比赛中已经完全够用了”是对的. 1 #include<queue> 2 #include<vector> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib

最小生成树基础模板题(USACO Training Section 3.1 最短网络 Agri-Net)

农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场.为了用最小的消费,他想铺设最短的光纤去连接所有的农场. 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案.每两个农场间的距离不会超过100000 输入格式: 第一行: 农场的个数,N(3<=N<=100). 第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的