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相关推荐

  1. jzoj3337-[NOI2013模拟]wyl8899的TLE【字符串hash,二分】

    正题 题目大意 两个字符串A,BA,BA,B.可以修改AAA中的一个字符使得AAA中的1∼k1\sim k1∼k是BBB的子串,求kkk的最大值. 解题思路 先将AAA和BBB字符串hashhashh ...

  2. 转自他人——————TLE之前,没有一个节点叫失败!!!

    我想我十八年来记忆最深刻的夜晚,大概便是在吉林大学燥热的宿舍里,穿着橘黄色的短袖,努力咽下大口大口的雪碧.那天晚上我仰躺在吉大热得几乎不能入眠的床板上,一动不动,看夏夜里打不尽的蚊子在惨白的天花板下飞 ...

  3. ZOJ-1654 Place the Robots 拆行拆列构图+二分匹配 Or 最大独立点集+TLE

    题意:给定一个方格,格子中的每点由空地,草地和墙组成,每个空地可以放置一个机器人,每个机器人能够向四个方向扫射激光,所以要给定一种方案能够在棋盘上放置足够多的机器人.激光可以穿过草地但是不能够穿过墙. ...

  4. ACM练习 校赛183F:公平的游戏(TLE)【vector不重复添加、删除指定元素、排序】

    总时间限制: 1000ms 内存限制: 256000kB 描述 如果说考试还会受到天赋的影响,那最公平的游戏就非抽奖莫属了. 输入 第一行输入一个整数 N,代表操作的总数 接下来的 N 行中,第 i ...

  5. 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 ...

  6. Java每次输入一个字符+高精度取整计算(记洛谷P2394题WA+TLE+RE的经历,Java语言描述)

    祝大家圣诞节快乐 卑微菜鸡深夜写博客~~~55555 其实这题真的有毒 这题你要是C/C++,虽然语法不是辣么直接,但几行而已: #include<bits/stdc++.h>using ...

  7. C/C++编程笔记:输入输出的优化,你还为思路正确却TLE而烦恼吗?

    你还在为思路正确却TLE而烦恼吗? 我也没办法,谁让你是一枚蒟蒻呢 今天,本人给被TLE折磨的死去活来的各位介绍一个专治TLE的法宝: 此乃江湖一直流传着的 输入输出优化!!! 输入优化函数: 输出优 ...

  8. 每次都错部分分怎么办,总是个别点TLE,WA

    probelm 如题:因为OI有部分分,所以养成了不好的骗分习惯... 经常暴力拿前几个点,有个别点WA,TLE,MLE了也不会去深思. 结果:ACM就爆炸了.. solution WA:考虑特殊数据 ...

  9. 两行轨道报(TLE)简介

    卫星两行轨道报获取地址:http://www.celestrak.com/ 轨道报含义如下:             BEIDOU-3 M8                          1 43 ...

  10. POJ 3669 Meteor Shower 流星雨 解题思路心得 BFS广搜 C/C++AC代码(另有TLE不知其因)

    原题 http://poj.org/problem?id=3669 题意 贝西(Bessie)听说即将发生一场异常的流星雨;有报道称这些流星将坠入大地并摧毁其所击中的任何东西,为安全着急,她发誓要找到 ...

最新文章

  1. ElasticSearch优化系列一:集群节点规划
  2. 玩cf出现outofmemory_《穿越火线》的肖枫原型是CF选手白鲨吗?
  3. Qt调用OpenCV汇总(1)
  4. java排列组合算法优缺点,一招彻底弄懂!
  5. 软件定义汽车带来的困境——如何破局?
  6. Java 身份证号码识别系统
  7. 关于MFC自动生成的各个类的指针访问
  8. UITabBarController超强拓展
  9. 吊打面试官?2020 年数据库高频面试题 | 原力计划
  10. jpa 实体到数据库
  11. HUE与Zookeeper的集成
  12. 强化学习进阶【逆强化学习】
  13. 电话用计算机接听,有了这个神器,在PC上也能接听iPhone电话、收发短息啦(安卓也可以哦~)...
  14. 电磁铁基础知识介绍及各系列性能比较
  15. wpf中使用ListView
  16. verilog prbs
  17. 盛水容器问题php代码,盛水容器的形状如图2-13所示,已知各水面高程为▽1=1.15m,▽2=0.68m,▽3=0.44m...
  18. Django项目:CRM(客户关系管理系统)--69--59PerfectCRM实现king_admin行内编辑
  19. 中国制造2025——开篇随笔
  20. iOS图片不失真拉伸方法

热门文章

  1. php读取路由器arp表,详解ARP地址解析协议的工作流程
  2. 有关计算机知识竞赛的新闻稿,知识竞赛通讯稿5篇
  3. (附源码)ssmJavaEE无人机数据管理系统 毕业设计 111022
  4. [bzoj3202][SDOI2013]项链
  5. ubantu 20.04 系统重装
  6. 计算机领域中的token的意思
  7. 进制的概念与转换(二进制、十进制、八进制、十六进制)
  8. java循环抓取网页超链接_提取网页中的超链接
  9. Tecplot 输入数学符号
  10. 自我调整【管理学之十三】