• 【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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    12个JavaScript MVC框架评估 简单
    chrome developer tool 调试技巧 简单
    转CSS3线性渐变 简单
    base64:URL背景图片与web页面性能优化 简单
    转linux下apache安装gzip压缩 简单
    转思考什么时候使用Canvas 和SVG 简单
    转周报的逻辑 简单
    浏览器三种刷新方式采取的不同缓存机制 简单
    poj 1308 Is It A Tree? (并查集)
    poj 2912 Rochambeau (并查集+枚举)
  • 原文地址:https://www.cnblogs.com/horizonwd/p/11160163.html
Copyright © 2020-2023  润新知