首页 > 其他分享 >kmp板子

kmp板子

时间:2024-04-02 12:22:23浏览次数:20  
标签:tar int 板子 length kmp include Next

书上讲的感觉不好理解,不如算法竞赛上分析的

题目链接:
https://www.luogu.com.cn/problem/P3375
贴板子:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;


const int N = 1e6 + 5;
string tar, p;
int Next[N];
queue<int>qid;

void getNext()
{
	Next[0] = Next[1] = 0;
	for (int i = 1; i < p.length(); i++)
	{
		int j = Next[i];
		while (j and p[i] != p[j])j = Next[j];//回退
		if (p[j] == p[i])Next[i + 1] = j + 1;//修改i+1等于j+1(指向的位置)
		else Next[j + 1] = 0;//回退到id=0
	}
}
void kmp()
{
	getNext();//预处理Next数组
	int j = 0;
	for (int i = 0; i < tar.length(); i++)
	{
		while (j and tar[i] != p[j])j = Next[j];
		if (tar[i] == p[j])j++;
		if (j == p.length()) { qid.push(i - p.length() + 1 + 1); j = Next[j ]; }//qid的push这里要注意下就行,根据题目来
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> tar >> p;
	kmp();
	while (!qid.empty())
	{
		cout << qid.front() << endl;
		qid.pop();
	}
	for (int i = 1; i < p.length(); i++)cout << Next[i] << ' ';
	cout << Next[p.length()];
	return 0;
}

标签:tar,int,板子,length,kmp,include,Next
From: https://www.cnblogs.com/zzzsacmblog/p/18110315

相关文章

  • Ubuntu下本机向minicom板子传文件操作
    1.配置minicomlingd@ubuntu:~$  sudominicom-s    出现这样的配置界面:       +-----[configuration]------+       |Filenamesandpaths   |       |Filetransferprotocols |       |Serialport......
  • 图论板子
    链式前向星的存储模板#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#include<map>#inclu......
  • KMP算法
    一.概述要解决的问题:字符串匹配问题。目标串target:"aabaabaafa"模式串pattern:"aabaaf"传统算法:双层for循环遍历目标串target和模式串pattern,判断pattern在target第一次出现的位置。时间复杂度为:\(O(pattern.size()*target.size())\)=\(O(m*n)\)KMP算法核心思路:在对目标......
  • Tarjan板子
    Tarjan画图必备强连通分量(有向边)常见题建好有向图找强连通分量,同时记录每个强连通分量中节点的个数找节点个数最小的强连通分量点击查看代码structEdge{ intto,next;}edge[N];voidadd(intu,intv){ edge[++cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt;......
  • KMP
    PMT:部分匹配表(PartialMatchTable)表示含义:t[0,i]的前后缀最大匹配长度s=input()t=input()n,m=len(s),len(t)pmt=[0]*mc=0foriinrange(1,m):x=t[i]whilecandt[c]!=x:c=pmt[c-1]ift[c]==x:c+=1pmt[......
  • 灵茶之KMP01
    灵茶之KMP01题目链接https://codeforces.com/problemset/problem/1137/B题目大意输入两个长度均≤\(5*10^5\)的字符串s和字符串t,只包含'0'和'1'。重排s中的字符,使得s中有尽量多的子串等于t。输出重排后的s。如果有多个答案,输出任意一个。思路贪心的思路......
  • KMP算法
    对于字符串“abababca”,它的next如下表所示:voidget_next(SStringT,int*next){inti=1,j=0;next[1]=0;//next[1]的值总是0while(i<T.length){if(j==0||T.ch[i]==T.ch[j]){//如果j处于0位或者,俩字符相等++i......
  • C语言查找-----------BF算法&&KMP算法
    1.问题引入有一个主字符串,有一个子字符串,要求我们寻找子字符串在主字符串里面开始出现的位置;2.BF算法BF算法就是暴力算法,这个做法虽然效率不高,但是按照我们传统的思路依然能够得到结果,接下来我们使用C语言实现这个查找的过程;#include<stdio.h>#include<assert.h>#includ......
  • 使用幸狐LuckFox Pico Plus 板子搭载Alpine Linux,运行dotnet net6程序 闪烁一颗LED灯
    程序截图 实拍 性能消耗非常小的,就是对ROM有要求,SDK+程序占了40M 步骤1:按照链接教程刷入系统步骤2:修改以太信息步骤3:使用ssh登录系统步骤4:搭建dotnet环境,使用手动的方式先下载运行时包下载.NET6.0Runtime(v6.0.28)-LinuxArm32AlpineBinaries(microsoft.co......
  • 08天【代码随想录算法训练营34期】第四章 字符串part02(KMP)
    KMP算法解决字符串匹配问题文本串aabaabaaf模式串aabaaf问:模式串是否在文本串中出现过?1)暴力解法,ptr指向文本串index0,遍历一遍发现不匹配,ptr再移向index1,遍历……依次重复,直到ptr指向32)KMP算法,ptr指向文本串index0,遍历到f发现不匹配,由于“aa”在字符串中index3和4时也出现......