[bzoj3670][2014湖北省队互测week2]似乎在梦中见过的样子
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]似乎在梦中见过的样子相关推荐
- P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...
- 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 ...
- GCD BZOJ2818 [省队互测] 数学
题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入样例#1: 复制 4 ...
- 2017.10.24队内互测——压轴出场的互测终曲|(*_-)
出题人: Sherlock, Frank, WWQ, MurasameKatana 终于到了我们组出题啦. 题面都是我自己写的2333 Problem 1 :令咒 题目来源:http://codevs ...
- 2017.9.16队内互测——老年组Day1
2017.9.16队内互测--老年组Day1 出题人:feather,MeiCo,Summer,Black Problem 1: 对于100%的数据,n<=1000 截图比较奇怪-还请见谅 简单 ...
- UOJ#191. 【集训队互测2016】Unknown
UOJ#191. [集训队互测2016]Unknown 题目描述 Solution 二进制分组. 每一个组内维护一个斜率单调减的凸包. 因为有删点,避免出现反复横跳产生的爆炸复杂度,需要等到同一深度的 ...
- [2015国家集训队互测]口胡
比赛链接 http://uoj.ac/contest/11 口胡题解 A.[集训队互测2015]Robot 直接果断打暴力了...这个暴力很好写,我就不废话了 B.[集训队互测2015]Marketi ...
- 张江陵怎么从机械到计算机的,2014湖北省大学研究生院排行出炉 武汉大学居榜首...
2014湖北省大学研究生院排行出炉 武汉大学居榜首 2014.11.02 06:14:39新浪教育 摘要: 日前,艾瑞深中国校友会网最新发布<2014中国大学研究生教育评价报告>,报告公布 ...
- 湖北省专科计算机竞赛,NOI信息学竞赛2019年湖北省队名单
CCF NOI2019湖北省省队选拔活动于2019年4月6-7日在湖北武汉华中科技大学举行,由湖北省计算机学会组织.本次选拔活动分为两试,均为机试.最终成绩按照NOIP2018提高组成绩和省队选拔成绩 ...
最新文章
- mysql comment
- visual studio code的使用
- Unity AOP 处理异常的方法
- Scrapy爬虫(8)scrapy-splash的入门
- 操作系统的运行机制和体系结构
- 请说说接口和抽象类的区别?
- 用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序
- C++ 异常 与 ”为什么析构函数不能抛出异常“ 问题
- TypeScript 联合类型(union type)
- 理解点击屏幕的事件响应---对UIView的hitTest: withEvent: 方法的理解
- UVA1515	Pool construction (最小割模型)
- rocketmq下单支付场景
- 在UOS(deepin)系统下安装CPUS-PDF虚拟PDF打印机的方法
- GD32 程序烧录所遇到的问题
- win7 64位系统PS、AI、PSD缩略图预览补丁
- 性能测试--33Jvisualvm远程监控Linux服务器方案
- Java躲子弹课设,Robocode高手的诀窍 - 躲避子弹[Java编程]
- 3.4、云计算FusionAccess桌面运维与管理
- 程序员面试被问“你的缺点是什么”,该怎么回答?
- 企业邮箱客户端POP协议收信后,Webmail的邮件被删除,如何调整?
热门文章
- SharePoint 2007 SDK v1.5
- Apache POI和EasyExcel 第一集:小叙
- mysql 子分区_MySQL子分区一例
- sudo命令_用大写字母输入 Linux 命令,实现以 sudo 用户权限运行
- java boolean几个字节_Java中boolean类型到底占用多少个字节?
- hbuilderx 2.9.8 公用css样式_浅谈关于vue中scss公用的解决方案
- 电脑qq收藏在哪里_电脑突然死机了怎么办?几种常见电脑故障及其解决方法
- java 文件引用路径_JAVA项目引用文件路径问题
- ArcGIS Server的配置
- linux启动自动挂载共享文件,linux中自动挂载windows 共享目录