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\ ...
随机推荐
- 进入mysql数据库修改密码
mysql -hlocalhost -uroot -p #修改密码mysql> set password for root@localhost = password('root');#启动数据库 ...
- mybatis实现MySQL数据库的增删改查之二
这里直接附上代码: 1 package com.qijian.pojo; 2 3 import org.apache.ibatis.type.Alias; 4 5 6 public class Use ...
- python的二维数组操作--坑
用到python list的二维数组,发现有一些需要注意的地方. 第一种赋值方法: list0 = [[0]*3]*4 list0[0][1] = 1 print(list0) 输出结果为: [[0, ...
- C语言几种排序算法
(1)选择排序算法:选择排序算法是,将第一个数和其它的数比较,将较小的数(从小到大的排列)和第一个数换位,以此类推 #include<stdio.h> int main() { int i ...
- 神奇的 SQL 之性能优化 → 让 SQL 飞起来
开心一刻 一天,一个男人去未婚妻家玩,晚上临走时下起了大雨 未婚妻劝他留下来过夜,说完便去准备被褥,准备就绪后发现未婚夫不见了 过了好久,全身淋的像只落汤鸡的未婚夫回来了 未婚妻吃惊的问:" ...
- java实现发送短信验证码
java实现短信验证码发送 由于我们使用第三方平台进行验证码的发送,所以首先,我们要在一个平台进行注册. 在这里我选择是秒嘀科技,因为新人注册会赠送十元,足够测试使用了. 注册完成后,我们需要获取自己 ...
- Maven 中 install,package,deploy命令区别
mvn clean package依次执行了clean.resources.compile.testResources.testCompile.test.jar(打包)等7个命令. mvn clean ...
- Python作业---内置数据类型
实验2 内置数据类型 实验性质:验证性 一.实验目的 1.掌握内置函数.列表.切片.元组的基本操作: 2.掌握字典.集合和列表表达式的基本操作. 二.实验预备知识 1.掌握Python内置函数的基/本 ...
- selenium爬虫 | 爬取疫情实时动态(二)
'''@author:Billie更新说明:1-28 17:00 项目开始着手,spider方法抓取到第一条疫情数据,save_data_csv方法将疫情数据保存至csv文件1-29 13:12 目标 ...
- 【Vue】Vue开发环境搭建
Vue前置学习环境 文章目录 Vue前置学习环境 IDE Node.js 调试环境 工程环境 小结 IDE WebStorm 官网下载:https://www.jetbrains.com/websto ...