jzoj3337. wyl8899的TLE
Description
wyl8899今天也很刻苦的在做老师布置下来的题目!
这一天老师布置的题目是这样的:
给出两个仅含小写字母的字符串A和B,输出最大的k,使得A[1…k]是B的子串。
A和B的长度都不会超过50000。
很显然他并不知道正确的做法,但是他居然卡着时间过掉了老师给的数据!
你找到了他提交给老师的程序,经过测试你惊讶的发现,他的程序运行时间恰好是最终答案,单位是毫秒。
你现在找到了老师给的数据中的一笔,你决定至多修改A串中的一个字母,使得他的程序尽可能的慢。
现在,你能告诉我修改数据之后他的程序在这个测试点的运行时间么?(单位当然还是毫秒)
Input
两行,每行一个仅含小写字母的字符串,分别是A和B。
保证A和B的长度都不超过50000。
Output
你修改数据之后,wyl8899的程序在这个测试点的运行时间,单位是毫秒。
Sample Input
输入1:
adbc
aabbabd
输入2:
aab
aabcc
Sample Output
输出1:
3
输出2:
3
Data Constraint
保证A和B的长度都不超过50000。
Hint
数据是在Windows下生成的,测评环境是Linux。
由于换行符的差异,对于C/C++选手,请不要使用gets(s)读入一行字符,建议使用scanf("%s",s)的形式。
Pascal选手直接使用readln()读入一行即可,理论上readln()不会受到不同换行符的影响。
题解
这题真妙♂
0~100%
有两种方法,你没有听错,有两种方法。
第一种:暴力。
我们直接枚举当前把第i个位置的字符替换。
O(n2)O(n^2)O(n2)求解即可。
加上一个剪枝就好了——把相同且连续的字符缩在一起。
比如aabbbbccccd这样,用一个next来记录当前第i个位置最近的下一位与之不同的字符的位置。
似乎出题人也没有想到要卡掉这种方法。(滑稽)
第二种:错误的DP。
设f[i,0/1]f_{[i,0/1]}f[i,0/1]表示当前第i个位置,是否用掉过替换的机会的答案。
随意转移。当然,正确性显然错误。
然鹅数据还是放某些人过了或拿到97分。
100%
有超级多种解法
其实都是一个思想,做的时候各有不同罢了。
一个思路——枚举当前目标字符串中的开头位置,然后可以得到从当前位置开始不替换所能达到的最远位置。
那么考虑把这个最远位置给替换后,再往后继续拓展。
一种做法(当然是最优秀的做法)
我们处理出LCP(最长公共前缀)
然后利用LCP来做上面的东西即可。
这个LCP可以利用exkmp或后缀自动机或后缀数组来求。
另一种做法(比较容易卡掉)
我们考虑hash。
首先枚举开头位置,然后二分加上hash判定即可得到最远位置。
其次,我们还是利用二分继续往右边拓展。
时间复杂度是O(mlogm)O(m\ log\ m)O(m log m)的。
只是hash可能要用一个三重hash。
一个是上面做法优化版的做法
我们发现,在求最远位置的时候,前面有一大段都是匹配的。
而且,这一大段都是以匹配字符串第1位开始的。
这不就是kmp失配时的情况吗?
我们直接做一遍kmp,然后如果在失配的时候,再利用二分往后面拓展即可。
这样,我们就连hash都只需要用一重即可。
标程
uses math;
vari,j,k,l,r,mid,n,m,now,ans:longint;xx,yy,ad:int64;s,t:ansistring;next:array[0..500000] of longint;mi,z,o:array[0..500000] of int64;p:int64=29;mo:int64=1000000007;//hs:array[0..1000000007] of boolean;
begin//assign(input,'1data.in');reset(input);mi[0]:=1;for i:=1 to 500000 do mi[i]:=mi[i-1]*p mod mo;readln(s);readln(t);t:=t+'{';n:=length(s);m:=length(t);z[1]:=ord(s[1])-96;o[1]:=ord(t[1])-96;for i:=2 to n do z[i]:=(z[i-1]*p+ord(s[i])-96) mod mo;{ for i:=1 to n dobeginfor j:=i to n dobeginxx:=(z[j]-z[i-1]*mi[j-i] mod mo+mo) mod mo;hs[xx]:=true;end;end; }for i:=2 to m do o[i]:=(o[i-1]*p+ord(t[i])-96) mod mo;j:=0;for i:=2 to n dobeginwhile (j<>0) and (s[j+1]<>s[i]) do j:=next[j];if s[j+1]=s[i] then j:=j+1;next[i]:=j;end;j:=0;for i:=1 to m-1 dobeginif j=n thenbeginwriteln(n);halt;end;j:=j;if (j=0) and (t[i]<>s[j+1]) thenbeginl:=i;r:=m;k:=0;while l<=r dobeginmid:=(l+r) div 2;xx:=(z[j+1+mid-i]-z[j+1]*mi[mid-i] mod mo+mo) mod mo;yy:=(o[mid]-o[i]*mi[mid-i] mod mo+mo) mod mo;if xx=yy thenbegink:=mid;l:=mid+1;endelse r:=mid-1;end;ans:=max(ans,k-i+j+1);end;while (j>0) and (t[i]<>s[j+1]) dobeginl:=i;r:=m;k:=0;while l<=r dobeginmid:=(l+r) div 2;xx:=(z[j+1+mid-i]-z[j+1]*mi[mid-i] mod mo+mo) mod mo;yy:=(o[mid]-o[i]*mi[mid-i] mod mo+mo) mod mo;if xx=yy thenbegink:=mid;l:=mid+1;endelse r:=mid-1;end;ans:=max(ans,k-i+j+1);j:=next[j];end;if t[i]=s[j+1] then inc(j);if j=m then j:=next[m];ans:=max(ans,j);end;writeln(ans);
end.
end.
jzoj3337. wyl8899的TLE相关推荐
- jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】
正题 题目大意 两个字符串A,BA,BA,B.可以修改AAA中的一个字符使得AAA中的1∼k1\sim k1∼k是BBB的子串,求kkk的最大值. 解题思路 先将AAA和BBB字符串hashhashh ...
- 转自他人——————TLE之前,没有一个节点叫失败!!!
我想我十八年来记忆最深刻的夜晚,大概便是在吉林大学燥热的宿舍里,穿着橘黄色的短袖,努力咽下大口大口的雪碧.那天晚上我仰躺在吉大热得几乎不能入眠的床板上,一动不动,看夏夜里打不尽的蚊子在惨白的天花板下飞 ...
- ZOJ-1654 Place the Robots 拆行拆列构图+二分匹配 Or 最大独立点集+TLE
题意:给定一个方格,格子中的每点由空地,草地和墙组成,每个空地可以放置一个机器人,每个机器人能够向四个方向扫射激光,所以要给定一种方案能够在棋盘上放置足够多的机器人.激光可以穿过草地但是不能够穿过墙. ...
- ACM练习 校赛183F:公平的游戏(TLE)【vector不重复添加、删除指定元素、排序】
总时间限制: 1000ms 内存限制: 256000kB 描述 如果说考试还会受到天赋的影响,那最公平的游戏就非抽奖莫属了. 输入 第一行输入一个整数 N,代表操作的总数 接下来的 N 行中,第 i ...
- POJ 2240 ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
http://poj.org/problem?id=2240 用log化乘法为加法找正圈 c++ 110ms,g++tle #include <string> #include <m ...
- Java每次输入一个字符+高精度取整计算(记洛谷P2394题WA+TLE+RE的经历,Java语言描述)
祝大家圣诞节快乐 卑微菜鸡深夜写博客~~~55555 其实这题真的有毒 这题你要是C/C++,虽然语法不是辣么直接,但几行而已: #include<bits/stdc++.h>using ...
- C/C++编程笔记:输入输出的优化,你还为思路正确却TLE而烦恼吗?
你还在为思路正确却TLE而烦恼吗? 我也没办法,谁让你是一枚蒟蒻呢 今天,本人给被TLE折磨的死去活来的各位介绍一个专治TLE的法宝: 此乃江湖一直流传着的 输入输出优化!!! 输入优化函数: 输出优 ...
- 每次都错部分分怎么办,总是个别点TLE,WA
probelm 如题:因为OI有部分分,所以养成了不好的骗分习惯... 经常暴力拿前几个点,有个别点WA,TLE,MLE了也不会去深思. 结果:ACM就爆炸了.. solution WA:考虑特殊数据 ...
- 两行轨道报(TLE)简介
卫星两行轨道报获取地址:http://www.celestrak.com/ 轨道报含义如下: BEIDOU-3 M8 1 43 ...
- POJ 3669 Meteor Shower 流星雨 解题思路心得 BFS广搜 C/C++AC代码(另有TLE不知其因)
原题 http://poj.org/problem?id=3669 题意 贝西(Bessie)听说即将发生一场异常的流星雨;有报道称这些流星将坠入大地并摧毁其所击中的任何东西,为安全着急,她发誓要找到 ...
最新文章
- ElasticSearch优化系列一:集群节点规划
- 玩cf出现outofmemory_《穿越火线》的肖枫原型是CF选手白鲨吗?
- Qt调用OpenCV汇总(1)
- java排列组合算法优缺点,一招彻底弄懂!
- 软件定义汽车带来的困境——如何破局?
- Java 身份证号码识别系统
- 关于MFC自动生成的各个类的指针访问
- UITabBarController超强拓展
- 吊打面试官?2020 年数据库高频面试题 | 原力计划
- jpa 实体到数据库
- HUE与Zookeeper的集成
- 强化学习进阶【逆强化学习】
- 电话用计算机接听,有了这个神器,在PC上也能接听iPhone电话、收发短息啦(安卓也可以哦~)...
- 电磁铁基础知识介绍及各系列性能比较
- wpf中使用ListView
- verilog prbs
- 盛水容器问题php代码,盛水容器的形状如图2-13所示,已知各水面高程为▽1=1.15m,▽2=0.68m,▽3=0.44m...
- Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
- 中国制造2025——开篇随笔
- iOS图片不失真拉伸方法