蓝书2.2 KMP算法
T1 Radio Transmission bzoj 1355
题目大意:
一个字符串,它是由某个字符串不断自我连接形成的
但是这个字符串是不确定的,现在只想知道它的最短长度是多少
思路:
kmp 输出n-nxt[n]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 1000100
const int MOD=1e9+;
const int bas=;
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,nxt[MAXN];
char ch[MAXN];
int main()
{
n=read();scanf("%s",ch+);
for(int j=,i=;i<=n;i++)
{
while(ch[i+]!=ch[j+]&&j) j=nxt[j];
if(ch[i+]==ch[j+]) j++;
nxt[i+]=j;
}
printf("%d",n-nxt[n]);
}
T2 OKR-Periods of Words bzoj 1511
题目大意:
求一个串的所有前缀的最长周期(不算自己)长度之和
思路:
求出nxt后不断向前跳 用i减去跳过之后的nxt
不能用最短循环节累计的例子: abcdaa
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 1000100
const int MOD=1e9+;
const int bas=;
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,nxt[MAXN];
ll ans;
char ch[MAXN];
int main()
{
n=read();scanf("%s",ch+);
for(int j=,i=;i<=n;i++)
{
while(ch[i+]!=ch[j+]&&j) j=nxt[j];
if(ch[i+]==ch[j+]) j++;
nxt[i+]=j;
}
for(int i=;i<=n;i++)
{
if(!nxt[i]) continue;
while(nxt[nxt[i]]) nxt[i]=nxt[nxt[i]];
ans+=i-nxt[i];
}
printf("%lld",ans);
}
T3 似乎在梦中见过的样子 bzoj 3620
题目大意:
找出串中所有形如A+B+A的子串 len(A)>=k,len(B)>=1
思路:
每个点为起始点 做n遍kmp
每个终止点只需要判断是否存在nxt使border大于等于k且小于子串长度一半
奇奇怪怪的复杂度
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 15100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,nxt[MAXN],k;
ll ans;
char ch[MAXN];
int main()
{
scanf("%s",ch+);n=strlen(ch+),k=read();
for(int t=;t+*k<=n;t++)
{
nxt[t-]=nxt[t]=t-;
for(int j=t-,i=t;i<=n;i++)
{
while(ch[i+]!=ch[j+]&&j>=t) j=nxt[j];
if(ch[i+]==ch[j+]) j++;
nxt[i+]=j;
}
for(int i=t+*k;i<=n;i++)
{
int x=nxt[i];
while(*(x-t+)>=i-t+) x=nxt[x];
if(x-t+>=k) ans++;
}
}
printf("%lld",ans);
}
T4 Censoring bzoj 3942
题目大意:
有一个S串和一个T串,长度均小于1,000,000,设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加,若U串后缀为T,则去掉这个后缀继续流程
输出最后的S串
思路:
先nxt处理T 然后用一个手打栈记录U串
记录每个位置匹配到T的位置
匹配即可
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define inf 2139062143
#define ll long long
#define MAXN 1100100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,nxt[MAXN],top,pos[MAXN];
ll ans;
char ch[MAXN],s[MAXN],st[MAXN];
int main()
{
scanf("%s",s+);scanf("%s",ch+);
n=strlen(s+),m=strlen(ch+);
for(int j=,i=;i<=m;i++)
{
while(ch[i+]!=ch[j+]&&j) j=nxt[j];
if(ch[i+]==ch[j+]) j++;
nxt[i+]=j;
}
for(int j=,i=,x;i<=n;i++)
{
st[++top]=s[i],pos[top]=pos[top-];
while(st[top]!=ch[pos[top]+]&&pos[top]) pos[top]=nxt[pos[top]];
if(st[top]==ch[pos[top]+]) pos[top]++;
if(pos[top]==m) top-=m;
}
for(int i=;i<=top;i++) printf("%c",st[i]);
}
蓝书2.2 KMP算法的更多相关文章
- 蓝书3.3 SPFA算法的优化
T1 最小圈 bzoj 1486 题目大意: 一个环的权值平均值为定义为一个这个环上所有边的权值和除以边数 求最小的环的权值平均值 思路: 二分一个值 把所有边减去这个值 判断是否有负环 #inclu ...
- KMP算法总结
kmp算法的T子字符串的下标的变化规律 大话数据结构这边书中的KMP算法的讲解跟最终的算法代码还是有很大的差别 java语言只会if判断语句,循环语句,但是这些语句以及可以包罗万象了,可以适用很多情况 ...
- 51NOD 1292 1277(KMP算法,字符串中的有限状态自动机)
在前两天的CCPC网络赛中...被一发KMP题卡了住了...遂决定,哪里跌倒就在哪里爬起来...把个KMP恶补一发,连带着把AC自动机什么的也整上. 首先,介绍设定:KMP算法计划解决的基本问题是,两 ...
- (原创)详解KMP算法
KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年压根就没看懂过~~~ 之后也在很多地方也都经常看到讲解KMP算法的文章,看久了好像也知道是怎么 ...
- 【模式匹配】KMP算法的来龙去脉
1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...
- 模式匹配KMP算法
关于KMP算法的原理网上有很详细的解释,我试着总结理解一下: KMP算法是什么 以这张图片为例子 匹配到j=5时失效了,BF算法里我们会使i=1,j=0,再看s的第i位开始能不能匹配,而KMP算法接下 ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
- KMP算法——Javascript实现
腾讯和阿里的笔试刚过去了,里面有很多题都很值得玩味的.之前Blog积累的很多东西,还要平时看的书,都有很大的帮助.这个深有体会啊! 例如,腾讯有一道算法题是吃香蕉(好邪恶的赶脚..),一次吃一根或者两 ...
- 字符串匹配之KMP算法
KMP算法使用前缀函数来模拟有限自动机的后缀函数,前缀函数通过计算模式与其自身的偏移匹配的信息,本身的证明很复杂,关键在于弄懂其核心思想,下面就不赘述了,仅仅贴出代码: #include <io ...
随机推荐
- CentOS 6, 编译安装lamp (php-fpm)
1 整体要求 php-fpm.httpd.mysql三者分别安装在三台虚拟机上: 第一台虚拟主机用于安装Mariadb,第二台虚拟主机安装php-fpm:第三台虚拟主机安装httpd.三台主机安装完之 ...
- Tomcat8.0 JDK1.8 的详细配置 Win10
官网下载 先安装JDK以及JRE 之后安装Tomcat jdk配置环境变量: 用户变量:path:C:\Program Files\Java\jdk1.8.0_161\bin ( jdk安装的 ...
- MySQL-----删
删 **清空数据库内容** delete from 数据库表名; ----清内容,但是自增列的数不清. truncate table 数据库表名; --------自增列的数也清. **清除指定的行数 ...
- PowerShell Tools for Visual Studio 2015
首先要去下载Visual Studio 2015 RC 版本 https://www.visualstudio.com/en-us/downloads/visual-studio-2015-downl ...
- C51 蜂鸣器 个人笔记
音调:频率 音量:高低电平占空比 有源:上面没有加号,只需高低电平即可发声 无源:上面有加号,不仅要电平,还要, 的频率 这里的有源不是指电源的"源",而是指有没有自带震荡电路,有 ...
- Jmeter-接口测试实例讲解
一.测试需求描述 1. 本次测试的接口为http服务端接口 2. 接口的主要分成两类,一类提供给查询功能接口,一类提供保存数据功能接口,这里我们举例2个保存数据的接口,因为这两个接口有关联性,比较有代 ...
- Leetcode 188.买卖股票的最佳时机IV
买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...
- Codeforces Round #304 (Div. 2)-D. Soldier and Number Game,素因子打表,超时哭晕~~
D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- 郁闷的出纳员(bzoj 1503)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- Memory Ordering in Modern Microprocessors
Linux has supported a large number of SMP systems based on a variety of CPUs since the 2.0 kernel. L ...