LibreOJ #10047
应同机房某大佬的要求来写这篇题解
Description
给定一个字符串 \(S\) 和一个数 \(K\),要求求出 \(S\) 的所有形似 \(A+B+A\) 的子串数量,其中 \(\mid A\mid \ge K\),\(\mid B\mid \ge 1\)
位置不同其他性质相同的子串算不同子串,位置相同但拆分不同的子串算同一子串
Solution
设 \(S\) 的长度为 \(n\)
对于 \(S\) 从 \(1\) 到 \(n\) 的每一个位置,以当前位置的字符作为一个子串的起点,然后寻找它的终点,来确定当前子串是否满足条件
对于 \(Next\) 数组的预处理还是相同操作,但是每换一个起点就要重新处理一次,只处理从当前位置到最后的字符
对于每个子串的终点,可以发现,只要在满足总长度的情况下不停回溯,才能统计所有的情况
回溯到最后的位置就是与它相同的最初子串的结束位置,因为不同位置相同子串算作同一子串,所以遇到相同的时,回溯到第一个相同子串便可统计
同理,若第一个相同子串不满足长度限制,那么后面的必定也不满足长度限制
具体原理请参考 KMP 的 \(Next\) 数组的原理
最后再判断一下子串的相同前后缀长度是否满足大于 \(K\) 就好了
Code
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define maxn 1000010
using namespace std;
int Nxt[maxn],J,n,k;
int ans;
char s[maxn];
int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
}
void Kmp(int Begin){
J=Begin-1;Nxt[Begin]=Nxt[Begin-1]=J;
for(int i=Begin;i<n;i++){
while(J>Begin-1&&s[J+1]!=s[i+1]) J=Nxt[J];
if(s[J+1]==s[i+1]) J++;
Nxt[i+1]=J;
}
for(int i=Begin;i<n;i++){
J=Nxt[i+1];//
while(J>Begin-1&&Begin+2*(J-Begin+1)>i+1) J=Nxt[J];//
if(J-Begin+1>=k) ans++;
}
}
int main(){
scanf("%s",s+1);k=read();
n=strlen(s+1);Nxt[0]=Nxt[1]=1;
for(int i=1;i<=n;i++) Kmp(i);
printf("%d",ans);
return 0;
}
LibreOJ #10047的更多相关文章
- UVa 10047,独轮车
题目链接:https://uva.onlinejudge.org/external/100/10047.pdf 题目链接:http://vjudge.net/contest/132239#proble ...
- LibreOJ 题解汇总
目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #10 ...
- LibreOJ#143 质数判定 [Miller_Rabin]
题目传送门 质数判定 题目描述 判定输入的数是不是质数. 输入格式 若干行,一行一个数 x. 行数不超过 $1.5\times 10^4$ 输出格式 对于输入的每一行,如果 x是质数输出一行 Y,否则 ...
- 【LibreOJ】#538. 「LibreOJ NOIP Round #1」数列递推
[题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...
- LibreOJ β Round #2 题解
LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...
- loj #547. 「LibreOJ β Round #7」匹配字符串
#547. 「LibreOJ β Round #7」匹配字符串 题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...
- [LOJ#531]「LibreOJ β Round #5」游戏
[LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...
- [LOJ#530]「LibreOJ β Round #5」最小倍数
[LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...
- [LOJ#516]「LibreOJ β Round #2」DP 一般看规律
[LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...
随机推荐
- 深入理解Redis系列之持久化
redis持久化配置 redis.conf // RDB配置 save 900 1 save 300 10 save 60 10000 // AOF配置 appendonly yes //AOF三种同 ...
- TurtleBot3 Waffle (tx2版华夫)(4)笔记本与TX2的通信
4.1. 使用vnc控制华夫Turbot3-Tx2开发板 1) 电脑端安装vnc viewer,您可以选择应用商城下载安装即可: 2) 下载后打开,键入Turbot3的ip à回车à选择连接: 3) ...
- jQuery 日常笔记
1.$(document).read(function(){$('p').click(function(){ $('p').hide();})})2.jquery是客户端脚本3.$("p&q ...
- 对接口报错404 发现url多了一些不可描述的代码%E2%80%8B
接口url出现了空格,复制的url可能出现空格肉眼看不出来,手动输入一遍URL
- 总结(2019CSP之后),含题解
从\(\mathcal{CSP}\) 爆炸 到现在,已经有\(3\)个月了.这三个月间,我--这个小蒟蒻又接触了许多听不懂的东西 \(\mathcal{No.}1\) 字符串\(\mathcal{ha ...
- 什么时候使用Get请求/POST请求?
当请求无副作用时(如进行搜索),便可使用GET方法:当请求有副作用时(如添加数据行),则用POST方法. 一个比较实际的问题是:GET方法可能会产生很长的URL,或许会超过某些浏览器与服务器对URL长 ...
- 如何优雅地开发HarmonyOS APP应用
目录: 一.挖掘项目需求或者做项目移植 二.创建项目工程 三.功能模块实现的流程思路 四.养成良好的编程规范习惯以及运用设计模式 研究HarmonyOS有一段时间了,今天主要结合自己多年的项目开发经验 ...
- App控件定位
本文将分享Android相关基础知识和Android APP控件定位工具的使用方法. Android基础知识 Android布局 Android是通过容器的布局属性来管理子控件的位置关系(iOS去掉了 ...
- Ansible User 模块添加单用户并ssh-key复制
Ansible User 模块添加单用户并ssh-key复制 1 Ansible 版本: ansible 2.9.6 config file = /etc/ansible/ansible.cfg co ...
- docker 删除和拉取镜像
删除镜像 # docker rmi -f 镜像id # 删除指定镜像 docker rmi -f 25d5f6s564 # docker rmi -f 镜像id 镜像id # 删除多个镜像 docke ...