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的更多相关文章

  1. [JZOJ3337] 【NOI2013模拟】wyl8899的TLE

    题目 题目大意 给你两个字符串\(A\)和\(B\),可以修改\(A\)中的一个字符,求修改后最长的\(A\)的前缀,使它是\(B\)的子串. 思考历程 看到这道题之后,第一眼想到的就是后缀自动机! ...

  2. 卫星轨道和两行数据TLE

    最近由于Sino-2和北斗的关系,很多网友贴了表示卫星运行轨道的TLE数据.这里想对卫星轨道参数和TLE的格式做一个简单介绍.虽然实际上没有人直接读TLE数据,而都是借助软件来获得卫星轨道和位置信息, ...

  3. hdu 3068 最长回文子串 TLE

    后缀数组+RMQ是O(nlogn)的,会TLE..... 标准解法好像是马拉车,O(n).... #include "algorithm" #include "cstdi ...

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

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

  6. SPOJ 274 Johnny and the Watermelon Plantation(TLE)

    O(n^3)的时间复杂度,改了半天交了二三十遍,TLE到死,实在没办法了…… 跪求指点!!! #include <cstdio> #include <cstdlib> #inc ...

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

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

  8. 关于Java中Arrays.sort()方法TLE

    最近一直在练用Java写题,今天无意发现一道很简单的二分题(链接),我一开始是直接开int[]数组调用Arrays.sort()去排序,没想到TLE了,原来是因为jdk中对于int[]的排序是使用快速 ...

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

随机推荐

  1. JS Date Math Number

    Date对象 Date对象和String对象不太一样,定义了一字符串,其实就是一个String对象,就可以直接调用属性和方法. Date对象的使用,必须使用new关键字来创建,否则,无法调用Date对 ...

  2. mybatis 处理CLOB/BLOB类型数据

    BLOB和CLOB都是大字段类型. BLOB是按二进制来存储的,而CLOB是可以直接存储文字的. 通常像图片.文件.音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去.文章或者是较长的文字 ...

  3. 第六天 函数与lambda表达式、函数应用与工具

    一.函数 1.匹配 位置匹配 def func(a,b,c): print(a,b,c) func(c=1,a=2,b=3) 2 3 1 def func(a, b=2, c=3): print(a, ...

  4. javascript字符串方法学习汇总

    1.charAt(index) charAt(index):返回字符串中指定位置的字符 var str = 'abcdefghi'; console.log(str.charAt()); // 输出 ...

  5. SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: InlineParameterMap

    <select id="getResByName" resultClass="Resources" parameterClass="java.l ...

  6. mysql 数据库基本命令

    停止mysql服务:net stop mysql      //管理员方式运行 启动mysql服务:net start mysql 进入数据库:mysql -u root -p 查看数据库:show ...

  7. mysql 复制原理详解

    http://www.cnblogs.com/kristain/articles/4142970.html

  8. 从零开始:Mysql基于Amoeba的集群搭建

    从零开始:Mysql基于Amoeba的集群搭建 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.amoeba-mysql-binary-2.0. ...

  9. CSIC_716_20191031【计算机的组成】

    引言 什么是编程语言 语言是人与人之间的沟通介质之一,编程语言是人与机器(包括计算机)之间沟通的介质. 一个完整的计算机系统主要包括     应用程序  .操作系统  和硬件   等. 计算机三大核心 ...

  10. iptables 命令大全

    1.连续端口配置 iptables可以方便的配置多个端口.其中根据端口的连续性,又可分为连续端口配置和不连续端口配置. 如: -A INPUT -p tcp –dport 21:25 -j DROP/ ...