zoukankan      html  css  js  c++  java
  • Text Editor Gym

      题目意思是给你一个主串和一个子串,然后要求你在子串的所有前缀串里找到一个最长的串,满足在主串里至少出现了ti次。

    做法就是求出a串和b串的hash值,然后二分b串的长度就行了。

    #include<bits/stdc++.h>//二分+hash
    using namespace std;
    #define ull unsigned long long
    const int maxn=1e5+10;
    ull hasha[maxn],hashb[maxn],base=131,ipow[maxn];
    char a[maxn],b[maxn];
    int lena,lenb,ans=-1,ti;
    bool check(int mid)
    {
        int tmp=0;
        for(int i=1;i<=lena-mid+1;i++)
        {
            ull zchash=hasha[i+mid-1]-hasha[i-1]*ipow[mid];
            if(zchash==hashb[mid])
            {
                tmp++;
                if(tmp==ti)
                    return true;
    
            }
        }
        return false;
    
    }
    int main()
    {
        gets(a+1);
        gets(b+1);
        lena=strlen(a+1);
        lenb=strlen(b+1);
        scanf("%d",&ti);
        //cout<<a<<endl<<b<<endl<<ti<<endl;
        hasha[0]=hashb[0]=0;
        ipow[0]=1;
        for(int i=1;i<=maxn;i++)
            ipow[i]=ipow[i-1]*base;
        for(int i=1;i<=lena;i++)
            hasha[i]=hasha[i-1]*base+a[i];
        for(int i=1;i<=lenb;i++)
            hashb[i]=hashb[i-1]*base+b[i];
        int low=1,up=lenb,mid;
        while(low<=up)
        {
            mid=(low+up)/2;
            if(check(mid))
            {
                ans=mid;
                low=mid+1;
            }
            else
                up=mid-1;
        }
        if(ans==-1)
            cout<<"IMPOSSIBLE"<<endl;
        else
        {
            for(int i=1;i<=ans;i++)
                cout<<b[i];
            cout<<endl;
        }
    
    
        return 0;
    
    }
    
    
  • 相关阅读:
    BZOJ 2299 向量
    BZOJ 1237 配对
    BZOJ 2226 LCMSum
    BZOJ 1876 SuperGCD
    查漏补缺:C++STL简述(容器部分)
    查漏补缺:Linux进程与线程的区别
    码海拾遗:常用的其中排序算法
    码海拾遗:简述C++(一)
    码海拾遗:简单的链表类
    码海拾遗:位运算实现加减乘除
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754941.html
Copyright © 2011-2022 走看看