【kmp】似乎在梦中见过的样子
参考博客:
BZOJ 3620: 似乎在梦中见过的样子
【KMP】似乎在梦中见过的样子
题目描述
这是Modoka的一个噩梦,也同时是上个轮回中所发生的事。为了使这一次Madoka不再与QB签订契约,Homura决定在刚到学校的第一天就解决QB。然而,QB也是有许多替身的(但在第八话中的剧情显示它也有可能是无限重生的),不过,意志坚定的Homura是不会放弃的——她决定消灭所有可能是QB的东西。现在,她已感受到附近的状态,并且把它转化为一个长度为n的字符串交给了学OI的你。
现在你从她的话中知道,所有形似于A+B+A的字串都是QB或它的替身,且∣A∣≥k,∣B∣≥1(位置不同其他性质相同的子串算不同子串,位置相同但拆分不同的子串算同一子串),然后你必须尽快告诉Homura这个答案——QB以及它的替身的数量。
注:对于一个字符串S,|S|表示S的长度。
输入
输出
样例输入
aaaaa
1
样例输出
6
提示
对于全部数据,1≤∣S∣≤1.5×104,1≤k≤100,且字符集为所有小写字母。
【题解】
就在参考博客里面了。
主要是自己不要意思把别人画的图复制过来。
枚举所有左端点然后进行向右看看有没有一个最长前缀是符合要求的。
就是这么一个想法,但是细节稍微有点多。因为两层for需要更细心。
【代码】:
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std;
const int N = 1e5+; char s[N];
int k,n,ans;
int Next[N];
int main()
{
scanf("%s%d",s+,&k);
n = strlen( s+ ); //printf("%s %d %d\n",s+1,k,n);
//枚举所有合法的左端点,左端点 预留2*k的距离
for(int L=; L<= n-(k*) ; L++ ) { for(int i = ; i <= L ; i++ ) Next[i] = L- ; //提前预处理好Next数组
for(int i=L+,j=L-;i<=n;i++){
while( j != L- && s[i] != s[j+] ) j=Next[j];
if( s[i] == s[j+] ) j++ ;
Next[i] = j ;
} for(int i=L+,j=L-;i<=n;i++){
while( j != L- && s[i] != s[j+] ) j=Next[j];
if( s[i] == s[j+] ) j++ ; //预处理的Next派上用场了
//当最长前缀的两倍 > 当前串(右端点-左端点)的长度
//利用Next数组缩短距离
while( (j-L+)* >= (i-L+) ) j = Next[j] ; //符合题意 累加答案,即前缀长度大于k
if( j-L+ >= k ) ans ++ ;
} }
printf("%d\n",ans);
return ;
}
【kmp】似乎在梦中见过的样子的更多相关文章
- 【BZOJ 3620】 3620: 似乎在梦中见过的样子 (KMP)
3620: 似乎在梦中见过的样子 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 755 Solved: 445 Description “Madok ...
- 似乎在梦中见过的样子 (KMP)
# 10047. 「一本通 2.2 练习 3」似乎在梦中见过的样子 [题目描述] 「Madoka,不要相信 QB!」伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Mo ...
- 【BZOJ3620】似乎在梦中见过的样子 KMP
[BZOJ3620]似乎在梦中见过的样子 Description “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个 ...
- BZOJ 3620: 似乎在梦中见过的样子
似乎在梦中见过的样子.... 一道水题调了这么久,还半天想不出来怎么 T 的...佩服自己(果然蒟蒻) 这题想想 KMP 但是半天没思路瞟了一眼题解发现暴力枚举起始点,然后 KMP 如图: O( n2 ...
- BZOJ_3620_似乎在梦中见过的样子_KMP
BZOJ_3620_似乎在梦中见过的样子_KMP Description “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka ...
- bzoj3620似乎在梦中见过的样子
bzoj3620似乎在梦中见过的样子 题意: 给出一个字符串,要求求出形如A+B+A的子串数量,且lenA≥k,lenB≥1.字符串长度≤15000,k≤100,所以字符长度为小写字母. 题解: 第一 ...
- [BZOJ 3620] 似乎在梦中见过的样子 【KMP】
题目链接:BZOJ - 3620 题目分析 这道题使用 KMP 做 O(n^2) 的暴力就能过. 首先,我们依次枚举字串左端点 l ,然后从这个左端点开始向后做一次 KMP. 然后我们枚举右端点 r ...
- BZOJ.3620.似乎在梦中见过的样子(KMP)
题目链接 /* 896kb 6816ms A+B+A是KMP的形式,于是固定左端点,对于每个位置i,若fail[i]所能到的点k中(k=fail[fail[fail[...]]]),有满足len(l~ ...
- 【kmp】bzoj3620: 似乎在梦中见过的样子
考察kmp理解题 Description “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中 ...
随机推荐
- HDU 1074 Doing Homework ——(状态压缩DP)
考虑到n只有15,那么状压DP即可. 题目要求说输出字典序最小的答案的顺序,又考虑到题目给出的字符串本身字典序是递增的,那么枚举i的时候倒着来即可.因为在同样完成的情况下,后选字典序大的,小的字典序就 ...
- final关键字的理解
final :最终作为一个修饰符 1.可以修饰类,函数,变量: 2.被final修饰的类不可以被继承: 3.被final修饰的方法不可以被复写: 4.被final修饰的变量是一个常量,只能赋值一次,既 ...
- this关键字的用法小结
1.this :指它所在函数所属对象的引用. 简单说:哪个对象调用this所在的函数,this就指哪个对象. 主要是为了区分:成员变量和局部变量 2.构造函数之间的调用用this关键字,如,this( ...
- Java并发指南14:Java并发容器ConcurrentSkipListMap与CopyOnWriteArrayList
原文出处http://cmsblogs.com/ 『chenssy』 到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash.TreeMap,这两种数据结构各自都有着优缺 ...
- 重读APUE(14)-主线程终止对子线程的影响
在main中创建线程,我们称main线程为主线程,新建线程为子线程(其实没有什么主线程和子线程的父子概念,它们是平行的,为了好理解这样称呼),如果子线程内部执行相对比较耗时的操作,主线程执行的快,而且 ...
- Python 自学笔记(五)
1.布尔值 1-1.概念 定义计算机中的逻辑判断,只有两种结果,True和False. if,while后面的判断条件就是布尔值,只有条件为True的时候才执行. 1-2.数值比较 1-3.数值运算 ...
- java 测试框架 TestNG
Java中print.printf.println的区别 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和prin ...
- oracle-sql脚本
select * from dba_users; create tablespace kyc_coo; create user kyc_coo identified by "123456&q ...
- ColorDrawable
最简单的一种Drawable,当我们将ColorDrawable绘制到Canvas(画布)上的时候, 会使用一种固定的颜色来填充Paint,然后在画布上绘制出一片单色区域! 1).Java中定义Col ...
- mybatis plus foreach 的用法
一: foreach 用于 select * from tablename where colname in (A,B,C……); 1:service 层: Set<String> tea ...