参考博客:

BZOJ 3620: 似乎在梦中见过的样子


【KMP】似乎在梦中见过的样子

题目描述

「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约。

这是Modoka的一个噩梦,也同时是上个轮回中所发生的事。为了使这一次Madoka不再与QB签订契约,Homura决定在刚到学校的第一天就解决QB。然而,QB也是有许多替身的(但在第八话中的剧情显示它也有可能是无限重生的),不过,意志坚定的Homura是不会放弃的——她决定消灭所有可能是QB的东西。现在,她已感受到附近的状态,并且把它转化为一个长度为n的字符串交给了学OI的你。

现在你从她的话中知道,所有形似于A+B+A的字串都是QB或它的替身,且∣A∣≥k,∣B∣≥1(位置不同其他性质相同的子串算不同子串,位置相同但拆分不同的子串算同一子串),然后你必须尽快告诉Homura这个答案——QB以及它的替身的数量。

注:对于一个字符串S,|S|表示S的长度。

输入

第一行一个字符串S,第二行一个数k。

输出

仅一行一个数ans,表示QB以及它的替身的数量。

样例输入

aaaaa
1

样例输出

6

提示

对于全部数据,1≤∣S∣≤1.5×104,1≤k≤100,且字符集为所有小写字母。


【题解】

就在参考博客里面了。

主要是自己不要意思把别人画的图复制过来。

枚举所有左端点然后进行向右看看有没有一个最长前缀是符合要求的。

就是这么一个想法,但是细节稍微有点多。因为两层for需要更细心。

【代码】:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4
 5 using namespace std;
 6 const int N = 1e5+10;
 7
 8 char s[N];
 9 int k,n,ans;
10 int Next[N];
11 int main()
12 {
13     scanf("%s%d",s+1,&k);
14     n = strlen( s+1 );
15
16     //printf("%s %d %d\n",s+1,k,n);
17     //枚举所有合法的左端点,左端点 预留2*k的距离
18     for(int L=1; L<= n-(k*2) ; L++ ) {
19
20         for(int i = 1 ; i <= L ; i++ ) Next[i] = L-1 ;
21
22         //提前预处理好Next数组
23         for(int i=L+1,j=L-1;i<=n;i++){
24             while( j != L-1 && s[i] != s[j+1] ) j=Next[j];
25             if( s[i] == s[j+1] ) j++ ;
26             Next[i] = j ;
27         }
28
29         for(int i=L+1,j=L-1;i<=n;i++){
30             while( j != L-1 && s[i] != s[j+1] ) j=Next[j];
31             if( s[i] == s[j+1] ) j++ ;
32
33             //预处理的Next派上用场了
34             //当最长前缀的两倍 > 当前串(右端点-左端点)的长度
35             //利用Next数组缩短距离
36             while( (j-L+1)*2 >= (i-L+1) ) j = Next[j] ;
37
38             //符合题意 累加答案,即前缀长度大于k
39             if( j-L+1 >= k ) ans ++ ;
40         }
41
42     }
43     printf("%d\n",ans);
44     return 0;
45 }

View Code

转载于:https://www.cnblogs.com/Osea/p/11333262.html

【kmp】似乎在梦中见过的样子相关推荐

  1. 【BZOJ 3620】 3620: 似乎在梦中见过的样子 (KMP)

    3620: 似乎在梦中见过的样子 Time Limit: 15 Sec  Memory Limit: 128 MB Submit: 755  Solved: 445 Description " ...

  2. 第2部分 字符串算法(提高篇)--第2章 KMP算法1469:似乎在梦中见过的样子

    1469:似乎在梦中见过的样子 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 476 通过数: 159 [题目描述] 原题来自:2014 年湖北省队互测 Week2 「Madok ...

  3. 似乎在梦中见过的样子 (KMP)

    # 10047. 「一本通 2.2 练习 3」似乎在梦中见过的样子 [题目描述] 「Madoka,不要相信 QB!」伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Mo ...

  4. BZOJ 3620 似乎在梦中见过的样子 KMP+暴力

    题目大意:给定一个字符串,求这个字符串有多少个子串满足这个子串可以拆分成ABA的形式,其中|A|>=k,|B|>=1 梦の中で逢った.ような-... n<=15000 显然是直接给你 ...

  5. 【bzoj3620】【似乎在梦中见过的样子】【kmp】

    Description "Madoka,不要相信 QB!"伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回 ...

  6. bzoj 3620: 似乎在梦中见过的样子 kmp暴力

    这道题目感觉上好像是可以用SA过掉的..但是看一下N15000然后Statue里面一个个都6000+ms,翻了一下题解发现是kmp暴力. 打了一半发现不会然后回去看题目,发现位置相同但是结构不懂的子串 ...

  7. BZOJ[3620]似乎在梦中见过的样子 KMP

    传送门ber~ 这题-不是和BZOJ[3670]那题一样吗? 对每一个位置进行两遍KMP,第一遍求出nex数组后再进行一遍以统计合法答案 比那题多个判断条件-其余一模一样 代码如下: #include ...

  8. bzoj 3620: 似乎在梦中见过的样子 kmp算法+暴力

    题意 "Madoka,不要相信 QB!"伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中所发生的事.为了 ...

  9. 【BZOJ3620】似乎在梦中见过的样子 KMP

    链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...

最新文章

  1. 【408】C函数中的ADT
  2. ORA-12519, ORA-00020异常产生原因及解决方案
  3. UIBezierPath的使用(持续更新)
  4. JavaScript那些事儿-不被知晓的预解释
  5. SpringBoot笔记-注册后发送邮箱点击激活(异步)
  6. DataGrid导出Excel
  7. python装饰器的顺序_python中装饰器的装饰顺序和执行顺序
  8. stm32PWM输入捕获模式详解
  9. .Net中的数字和日期格式化规则助记词
  10. 如何下载行政区划地图
  11. Anaconda配置强化学习环境
  12. 2020世界人工智能大会 -- 落地AI,赋能未来
  13. jit和jitx区别_JIT的核心思想是什么?
  14. 专访阿里云高级技术专家吴威:Kafka、Spark和Flink类支持流式计算的软件会越来越流行...
  15. Linux 文件系统的工作原理深度透析
  16. iOS开发系列--打造自己的“美图秀秀”
  17. C语言开发环境,请查收
  18. 2012美国大选献金项目数据分析
  19. Qt 实现自定义Ui控件例子,以自定义的Slider为例(QWidget)
  20. 计算机领域mips描述,在计算机领域,通常用MIPS来描述

热门文章

  1. DirectX11 With Windows SDK--15 几何着色器初探
  2. 牛客练习赛51c-勾股定理
  3. MySQL 数据表主键设计,选择自增 id 还是 UUID 还是雪花 id?
  4. uni-app开发经验分享二十二: uni-app大转盘思路解析
  5. 2014年10月25日深圳彩讯科技和北京宇信易诚的笔试记录
  6. Vue+SpringBoot+Mybatis的简单员工管理项目
  7. KeyBert、TextRank等九种本文关键词提取算法(KPE)原理及代码实现
  8. 靠“小龙虾”打天下,信良记的路还走得通吗?
  9. 电脑一直重新启动怎么回事
  10. 初学Python之math模块在哪里?