Cod sursa(job #2221588)

Utilizator patcasrarespatcas rares danut patcasrares Data 14 iulie 2018 22:23:42
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<fstream>
#include<cstring>
#include<unordered_map>
#define DN 16384
#define M1 6029
#define M2 5581
#define P 173
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int n,k,put1[DN],put2[DN],r1[DN],r2[DN],st,dr,mij;
char a[DN];
int vf(int f)
{
    int a,b,ma=0;
    unordered_map<int,int>mp;
    for(int i=f;i<=n;i++)
    {
        a=(r1[i]+M1-(put1[f]*r1[i-f])%M1)%M1;
        b=(r2[i]+M2-(put2[f]*r2[i-f])%M2)%M2;
        a=a*10000+b;
        mp[a]++;
        ma=max(ma,mp[a]);
    }
    if(ma>=k)
        return 1;
    return 0;
}
int main()
{
    fin>>n>>k;
    fin.getline(a+1,DN);
    fin.getline(a+1,DN);
    put1[0]=put2[0]=1;
    for(int i=1;i<DN;i++)
    {
        put1[i]=(put1[i-1]*P)%M1;
        put2[i]=(put2[i-1]*P)%M2;
    }
    for(int i=1;i<=n;i++)
    {
        r1[i]=(r1[i-1]*P+a[i]-'a')%M1;
        r2[i]=(r2[i-1]*P+a[i]-'a')%M2;
    }
    st=1;
    dr=n;
    while(st<dr)
    {
        mij=(st+dr+1)/2;
        if(vf(mij))
            st=mij;
        else
            dr=mij-1;
    }
    if(!vf(st))
        st=0;
    fout<<st;
}