当前位置: 首页 > news >正文

蓝书2.2 KMP算法

T1 Radio Transmission bzoj 1355

题目大意:

一个字符串,它是由某个字符串不断自我连接形成的

但是这个字符串是不确定的,现在只想知道它的最短长度是多少

思路:

kmp 输出n-nxt[n]

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<set>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 1000100
13 const int MOD=1e9+7;
14 const int bas=2333;
15 using namespace std;
16 inline int read()
17 {
18     int x=0,f=1;char ch=getchar();
19     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
20     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
21     return x*f;
22 }
23 int n,nxt[MAXN];
24 char ch[MAXN];
25 int main()
26 {
27     n=read();scanf("%s",ch+1);
28     for(int j=0,i=1;i<=n;i++)
29     {
30         while(ch[i+1]!=ch[j+1]&&j) j=nxt[j];
31         if(ch[i+1]==ch[j+1]) j++;
32         nxt[i+1]=j;
33     }
34     printf("%d",n-nxt[n]);
35 }
View Code

 

T2 OKR-Periods of Words  bzoj 1511

题目大意:

求一个串的所有前缀的最长周期(不算自己)长度之和

思路:

求出nxt后不断向前跳 用i减去跳过之后的nxt

不能用最短循环节累计的例子: abcdaa

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<set>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 1000100
13 const int MOD=1e9+7;
14 const int bas=2333;
15 using namespace std;
16 inline int read()
17 {
18     int x=0,f=1;char ch=getchar();
19     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
20     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
21     return x*f;
22 }
23 int n,nxt[MAXN];
24 ll ans;
25 char ch[MAXN];
26 int main()
27 {
28     n=read();scanf("%s",ch+1);
29     for(int j=0,i=1;i<=n;i++)
30     {
31         while(ch[i+1]!=ch[j+1]&&j) j=nxt[j];
32         if(ch[i+1]==ch[j+1]) j++;
33         nxt[i+1]=j;
34     }
35     for(int i=1;i<=n;i++)
36     {
37         if(!nxt[i]) continue;
38         while(nxt[nxt[i]]) nxt[i]=nxt[nxt[i]];
39         ans+=i-nxt[i];
40     }
41     printf("%lld",ans);
42 }
View Code

 

T3 似乎在梦中见过的样子 bzoj 3620

题目大意:

找出串中所有形如A+B+A的子串 len(A)>=k,len(B)>=1

思路:

每个点为起始点 做n遍kmp

每个终止点只需要判断是否存在nxt使border大于等于k且小于子串长度一半

奇奇怪怪的复杂度

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<set>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 15100
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
19     return x*f;
20 }
21 int n,nxt[MAXN],k;
22 ll ans;
23 char ch[MAXN];
24 int main()
25 {
26     scanf("%s",ch+1);n=strlen(ch+1),k=read();
27     for(int t=1;t+2*k<=n;t++)
28     {
29         nxt[t-1]=nxt[t]=t-1;
30         for(int j=t-1,i=t;i<=n;i++)
31         {
32             while(ch[i+1]!=ch[j+1]&&j>=t) j=nxt[j];
33             if(ch[i+1]==ch[j+1]) j++;
34             nxt[i+1]=j;
35         }
36         for(int i=t+2*k;i<=n;i++)
37         {
38             int x=nxt[i];
39             while(2*(x-t+1)>=i-t+1) x=nxt[x];
40             if(x-t+1>=k) ans++;
41         }
42     }
43     printf("%lld",ans);
44 }
View Code

 

T4 Censoring bzoj 3942

题目大意:

有一个S串和一个T串,长度均小于1,000,000,设当前串为U串,然后从前往后枚举S串一个字符一个字符往U串里添加,若U串后缀为T,则去掉这个后缀继续流程

输出最后的S串

思路:

先nxt处理T 然后用一个手打栈记录U串

记录每个位置匹配到T的位置

匹配即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<set>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 1100100
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
19     return x*f;
20 }
21 int n,m,nxt[MAXN],top,pos[MAXN];
22 ll ans;
23 char ch[MAXN],s[MAXN],st[MAXN];
24 int main()
25 {
26     scanf("%s",s+1);scanf("%s",ch+1);
27     n=strlen(s+1),m=strlen(ch+1);
28     for(int j=0,i=1;i<=m;i++)
29     {
30         while(ch[i+1]!=ch[j+1]&&j) j=nxt[j];
31         if(ch[i+1]==ch[j+1]) j++;
32         nxt[i+1]=j;
33     }
34     for(int j=0,i=1,x;i<=n;i++)
35     {
36         st[++top]=s[i],pos[top]=pos[top-1];
37         while(st[top]!=ch[pos[top]+1]&&pos[top]) pos[top]=nxt[pos[top]];
38         if(st[top]==ch[pos[top]+1]) pos[top]++;
39         if(pos[top]==m) top-=m;
40     }
41     for(int i=1;i<=top;i++) printf("%c",st[i]);
42 }
View Code

 

转载于:https://www.cnblogs.com/yyc-jack-0920/p/9323805.html

相关文章:

  • 双下划线一粗一细怎么加_跑跑卡丁车U型弯怎么过技巧教学
  • Java编程语言基础 第三章 季节if用法
  • 基础数据类型转换和深浅拷贝
  • matlab 子图title的位置_MATLAB技巧之绘图篇
  • 管程由哪三部分组成_中药材切片机主要由哪五部分组成呢?
  • socket-详细分析No buffer space available(转载)
  • 怎么保存到桌面_标签打印软件怎么保存标签
  • C++之继承(二)
  • docker mariadb集群_Docker搭建Django+Mariadb环境
  • VueX源码分析(1)
  • python合并文件夹_Python实现合并同一个文件夹下所有PDF文件的方法示例
  • iOS 应用性能调优的25个建议和技巧
  • arm ubuntu 编译boost_BFL库的安装(适用ubuntu)
  • 宏与内联函数
  • api接口怎么对接_微服务手册:API接口9个生命节点,构建全生命周期管理
  • @jsonView过滤属性
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译]如何构建服务器端web组件,为何要构建?
  • angular2开源库收集
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • EventListener原理
  • git 常用命令
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java IO学习笔记一
  • JavaScript DOM 10 - 滚动
  • JavaScript的使用你知道几种?(上)
  • k8s如何管理Pod
  • MySQL-事务管理(基础)
  • React系列之 Redux 架构模式
  • Redux 中间件分析
  • v-if和v-for连用出现的问题
  • 从tcpdump抓包看TCP/IP协议
  • 力扣(LeetCode)21
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 如何胜任知名企业的商业数据分析师?
  • 突破自己的技术思维
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • puppet连载22:define用法
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 国内开源镜像站点
  • 进程与线程(三)——进程/线程间通信
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #数学建模# 线性规划问题的Matlab求解
  • #图像处理
  • (2022 CVPR) Unbiased Teacher v2
  • (6)STL算法之转换
  • (Oracle)SQL优化技巧(一):分页查询
  • (第二周)效能测试
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .NET6 命令行启动及发布单个Exe文件
  • .net6+aspose.words导出word并转pdf
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945