Description

已知一个字符串S,求它有多少个形如A+B+A的子串(len(A)>=k,len(B)>=1 )。

Input

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

Output

仅一行一个数,表示满足条件的子串数。

Sample Input

aaaaa
1

Sample Output

6

HINT

对于 100%的数据:n<=15000 , k<=100,且字符集为所有小写字母。

Solution

这道题时限15s,明显O(n2)可以过。那么如果枚举某一端形成新的子串,用kmp的思想去处理的话,就可以过了。

那具体要如何处理这个子串呢?假设我们枚举左端点l,s长度为r,则形成的新子串为s[l...r]。

由题意我们可以知道,如果s[l...i]=s[j-i+l...j]且(i-l+1)>=k且l-1+(i-l+1)×2+1<=j,那么s[l...j]就是一个满足条件的子串,那么这道题就明显和Noi2014动物园很像了。

如果直接暴力用next[]找满足条件的前缀,实现会变成O(n3)。

所以这个地方得继续用kmp的思想:当发现现在的i不满足条件时,可以用next[]向前寻找满足条件的i。

这样的话,每次都是从满足(j-1)的条件的i开始寻找,于是时间复杂度就压到了O(n2)。

 1 #include<set>
 2 #include<cmath>
 3 #include<ctime>
 4 #include<queue>
 5 #include<stack>
 6 #include<cstdio>
 7 #include<vector>
 8 #include<cstring>
 9 #include<cstdlib>
10 #include<iostream>
11 #include<algorithm>
12 #define N 15002
13 using namespace std;
14 int next[N],n,k,ans;
15 char a[N];
16 inline void get_next(char a[]){
17     for(int i=2,j=0;a[i];i++){
18         while(j&&a[i]!=a[j+1]) j=next[j];
19         j+=(a[i]==a[j+1]);
20         next[i]=j;
21     }
22     for(int i=2,j=0;a[i];i++){
23         while(j&&a[i]!=a[j+1]) j=next[j];
24         j+=(a[i]==a[j+1]);
25         while(j&&j*2>=i) j=next[j];
26         if(j>=k) ans++;
27     }
28 }
29 inline void init(){
30     scanf("%s%d",a+1,&k);
31     n=strlen(a+1);n-=(k<<1);
32     for(int i=0;i<n;i++)
33         get_next(a+i);
34     printf("%d",ans);
35 }
36 int main(){
37     freopen("dream.in","r",stdin);
38     freopen("dream.out","w",stdout);
39     init();
40     fclose(stdin);
41     fclose(stdout);
42     return 0;
43 }

转载于:https://www.cnblogs.com/AireenYe/p/5653802.html

[bzoj3670][2014湖北省队互测week2]似乎在梦中见过的样子相关推荐

  1. P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...

  2. P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演 + 伯努利数)

    P6271 [湖北省队互测2014]一个人的数论 ∑i=1nim[gcd⁡(i,n)=1]∑d∣nμ(d)dm∑i=1ndim由伯努利数可知∑i=0nim=1m+1∑i=0mCm+1iBi(n+1)m ...

  3. GCD BZOJ2818 [省队互测] 数学

    题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入样例#1: 复制 4 ...

  4. 2017.10.24队内互测——压轴出场的互测终曲|(*_-)

    出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...

  5. 2017.9.16队内互测——老年组Day1

    2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...

  6. UOJ#191. 【集训队互测2016】Unknown

    UOJ#191. [集训队互测2016]Unknown 题目描述 Solution 二进制分组. 每一个组内维护一个斜率单调减的凸包. 因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的 ...

  7. [2015国家集训队互测]口胡

    比赛链接 http://uoj.ac/contest/11 口胡题解 A.[集训队互测2015]Robot 直接果断打暴力了...这个暴力很好写,我就不废话了 B.[集训队互测2015]Marketi ...

  8. 张江陵怎么从机械到计算机的,2014湖北省大学研究生院排行出炉 武汉大学居榜首...

    2014湖北省大学研究生院排行出炉 武汉大学居榜首 2014.11.02 06:14:39新浪教育 摘要: 日前,艾瑞深中国校友会网最新发布<2014中国大学研究生教育评价报告>,报告公布 ...

  9. 湖北省专科计算机竞赛,NOI信息学竞赛2019年湖北省队名单

    CCF NOI2019湖北省省队选拔活动于2019年4月6-7日在湖北武汉华中科技大学举行,由湖北省计算机学会组织.本次选拔活动分为两试,均为机试.最终成绩按照NOIP2018提高组成绩和省队选拔成绩 ...

最新文章

  1. mysql comment
  2. visual studio code的使用
  3. Unity AOP 处理异常的方法
  4. Scrapy爬虫(8)scrapy-splash的入门
  5. 操作系统的运行机制和体系结构
  6. 请说说接口和抽象类的区别?
  7. 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
  8. C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
  9. TypeScript 联合类型(union type)
  10. 理解点击屏幕的事件响应---对UIView的hitTest: withEvent: 方法的理解
  11. UVA1515 Pool construction (最小割模型)
  12. rocketmq下单支付场景
  13. 在UOS(deepin)系统下安装CPUS-PDF虚拟PDF打印机的方法
  14. GD32 程序烧录所遇到的问题
  15. win7 64位系统PS、AI、PSD缩略图预览补丁
  16. 性能测试--33Jvisualvm远程监控Linux服务器方案
  17. Java躲子弹课设,Robocode高手的诀窍 - 躲避子弹[Java编程]
  18. 3.4、云计算FusionAccess桌面运维与管理
  19. 程序员面试被问“你的缺点是什么”,该怎么回答?
  20. 企业邮箱客户端POP协议收信后,Webmail的邮件被删除,如何调整?

热门文章

  1. SharePoint 2007 SDK v1.5
  2. Apache POI和EasyExcel 第一集:小叙
  3. mysql 子分区_MySQL子分区一例
  4. sudo命令_用大写字母输入 Linux 命令,实现以 sudo 用户权限运行
  5. java boolean几个字节_Java中boolean类型到底占用多少个字节?
  6. hbuilderx 2.9.8 公用css样式_浅谈关于vue中scss公用的解决方案
  7. 电脑qq收藏在哪里_电脑突然死机了怎么办?几种常见电脑故障及其解决方法
  8. java 文件引用路径_JAVA项目引用文件路径问题
  9. ArcGIS Server的配置
  10. linux启动自动挂载共享文件,linux中自动挂载windows 共享目录