【JZOJ3337】wyl8899的TLE
description
wyl8899今天也很刻苦的在做老师布置下来的题目!
这一天老师布置的题目是这样的:
给出两个仅含小写字母的字符串A和B,输出最大的k,使得A[1..k]是B的子串。
A和B的长度都不会超过50000。
很显然他并不知道正确的做法,但是他居然卡着时间过掉了老师给的数据!
你找到了他提交给老师的程序,经过测试你惊讶的发现,他的程序运行时间恰好是最终答案,单位是毫秒。
你现在找到了老师给的数据中的一笔,你决定至多修改A串中的一个字母,使得他的程序尽可能的慢。
现在,你能告诉我修改数据之后他的程序在这个测试点的运行时间么?(单位当然还是毫秒)
analysis
有一种比较好想的方法是二分$+$字符串哈希
搞完两个串的哈希后,枚举母串的开始位置$i$
然后第一个二分找出从$B$的第$i$位开始的最长一段相同串的长度
第二个二分跳过中间不相同的点,再二分找出接下来的最长一段相同串,更新答案
注意中间有不少判断,比如判$A$串匹配完了或$B$串剩下位数不够匹配等等
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define q 29
#define MAXN 50005
#define mod 1000000007
#define ll long long
#define fo(i,a,b) for (ll i=a;i<=b;++i)
#define fd(i,a,b) for (ll i=a;i>=b;--i)
using namespace std;
char st1[MAXN],st2[MAXN];
ll hash1[MAXN],hash2[MAXN],mi[MAXN];
ll len1,len2,ans;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll get_hash1(ll x,ll y){return ((hash1[y]-hash1[x-1]*mi[y-x+1])%mod+mod)%mod;}
inline ll get_hash2(ll x,ll y){return ((hash2[y]-hash2[x-1]*mi[y-x+1])%mod+mod)%mod;}
int main()
{
scanf("%s%s",st1+1,st2+1);
len1=strlen(st1+1),len2=strlen(st2+1),mi[0]=1;
fo(i,1,len1)hash1[i]=(hash1[i-1]*q+st1[i]-'a')%mod;
fo(i,1,len2)hash2[i]=(hash2[i-1]*q+st2[i]-'a')%mod;
fo(i,1,len2)mi[i]=mi[i-1]*q%mod;
fo(i,1,len2)
{
ll l=1,r=len1,mid=(l+r)>>1;
while (l<=r)
{
mid=(l+r)>>1;
if (i+mid-1>len2 || get_hash1(1,mid)!=get_hash2(i,i+mid-1))r=mid-1;
else l=mid+1;
}
ll next=r+2,tot=((i+r-1==len2 && r!=len1)?r:r+1),tmp=r;
l=1,r=len1-r-1,mid=(l+r)>>1;
while (l<=r)
{
mid=(l+r)>>1;
if (i+tmp+mid>len2 || get_hash1(next,next+mid-1)!=get_hash2(i+tmp+1,i+tmp+mid))r=mid-1;
else l=mid+1;
}
ans=max(ans,r+tot);
}
printf("%lld\n",ans);
return 0;
}
【JZOJ3337】wyl8899的TLE的更多相关文章
- [JZOJ3337] 【NOI2013模拟】wyl8899的TLE
题目 题目大意 给你两个字符串\(A\)和\(B\),可以修改\(A\)中的一个字符,求修改后最长的\(A\)的前缀,使它是\(B\)的子串. 思考历程 看到这道题之后,第一眼想到的就是后缀自动机! ...
- 卫星轨道和两行数据TLE
最近由于Sino-2和北斗的关系,很多网友贴了表示卫星运行轨道的TLE数据.这里想对卫星轨道参数和TLE的格式做一个简单介绍.虽然实际上没有人直接读TLE数据,而都是借助软件来获得卫星轨道和位置信息, ...
- hdu 3068 最长回文子串 TLE
后缀数组+RMQ是O(nlogn)的,会TLE..... 标准解法好像是马拉车,O(n).... #include "algorithm" #include "cstdi ...
- 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 ...
- == Got TLE on OJ? Here is the solution! ==
As a solo warrior in OJ, I spent about nearly 50% of my time on tackling TLE - that is innumerous ho ...
- SPOJ 274 Johnny and the Watermelon Plantation(TLE)
O(n^3)的时间复杂度,改了半天交了二三十遍,TLE到死,实在没办法了…… 跪求指点!!! #include <cstdio> #include <cstdlib> #inc ...
- 转自他人——————TLE之前,没有一个节点叫失败!!!
我想我十八年来记忆最深刻的夜晚,大概便是在吉林大学燥热的宿舍里,穿着橘黄色的短袖,努力咽下大口大口的雪碧.那天晚上我仰躺在吉大热得几乎不能入眠的床板上,一动不动,看夏夜里打不尽的蚊子在惨白的天花板下飞 ...
- 关于Java中Arrays.sort()方法TLE
最近一直在练用Java写题,今天无意发现一道很简单的二分题(链接),我一开始是直接开int[]数组调用Arrays.sort()去排序,没想到TLE了,原来是因为jdk中对于int[]的排序是使用快速 ...
- 1833 深坑 TLE 求解
题目描述: 大家知道,给出正整数n,则1到n这n个数可以构成n!种排列,把这些排列按照从小到大的顺序(字典顺序)列出,如n=3时,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 ...
随机推荐
- NetBeans简介和简单使用
1.什么是NetBeans? NetBeans IDE:可以使开发人员利用Java平台能够快速创建Web.企业.桌面以及移动的应用程序: 支持语言:PHP.Ruby.JavaScript.Groovy ...
- 基于Netty的RPC架构学习笔记(十一):粘包、分包分析,如何避免socket攻击
文章目录 问题 消息如何在管道中流转 源码解析 AbstractNioSelector.java AbstractNioWorker.java NioWorker.java DefaultChanne ...
- Memory barrier,
A memory barrier, also known as a membar, memory fence or fence instruction, 是一种屏障指令,它使中央处理单元(CPU)或编 ...
- 17-Ubuntu-文件和目录命令-切换目录-相对路径和绝对路径
1.相对路径: 在输入路径时,最前面不是/或者~,表示相对当前目录所在的目录位置. 例:当前桌面目录下,通过相对路径切换到桌面目录下的Entertainment目录 2.绝对路径: 在输入路径时,最前 ...
- Codeforces 479【A】div3试个水
题目链接:http://codeforces.com/problemset/problem/977/A 题意:这个题,题目就是让你根据他的规律玩嘛.末尾是0就除10,不是就-1. 题解:题解即题意. ...
- Spring MVC @RequestMapping注解详解(2)
@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...
- Caused by: java.io.FileNotFoundException: class path resource [com/cxy/springboot/mapping/] cannot be resolved to URL because it does not exist
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...
- 笔记:Python防止SQL注入
非安全的方式,使用动态拼接SQL 输入' or 1 = 1 or '1 sql ="""SELECT * FROM goods WHERE name = '%s';&qu ...
- mysql的几种启动方式
mysql的四种启动方式: 1.mysqld 启动mysql服务器:./mysqld --defaults-file=/etc/my.cnf --user=root 客户端连接: mysql --de ...
- boost multi_index 插入返回值
boost multi_index 对象插入函数emplace() 的返回值,是一个std::pair<iterator, bool>该pair 的first 是一个插入成功的位置,第二个 ...