Cod sursa(job #2549311)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 17 februarie 2020 16:25:53
Problema Substr Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

#define mod 1000000007

#define modul 100007

using namespace std;

long long int v[16385],k,n,putere[16385];

string str;

vector<pair<int,int>>numere[100010];

int nrap(int val)
{
    int poz;
    poz=val%modul;
    for(int i=0; i<numere[poz].size(); ++i)
    {
        if(numere[poz][i].first==val)
        {
            return numere[poz][i].second;
        }
    }
    return 0;
}

void add(int val)
{
    int vf=0,poz;
    poz=val%modul;
    for(int i=0; i<numere[poz].size(); ++i)
    {
        if(numere[poz][i].first==val)
        {
            numere[poz][i].second++;
            vf=1;
            break;
        }
    }
    if(vf==0)
    {
        numere[poz].push_back({val,1});
    }
}

bool vf(long long st)
{
    long long nr=0;
    for(int i=1; i<=st; ++i)
    {
        nr=(1LL*nr*111+v[i])%mod;
    }
    add(nr);
    if(nrap(nr)>=k)
    {
        return 1;
    }
    for(int i=st+1; i<=n; ++i)
    {
        nr=(nr-(putere[st-1]*v[i-st])%mod+mod)%mod;
        nr=(1LL*nr*111+v[i])%mod;
        add(nr);
        if(nrap(nr)>=k)
        {
            return 1;
        }
    }
    return 0;
}

int main()
{
    ifstream fin("substr.in");
    ofstream fout("substr.out");
    fin>>n>>k>>str;
    putere[0]=1;
    for(int i=1; i<=n; ++i)
    {
        v[i]=str[i-1]-'a'+1;
        putere[i]=(1LL*putere[i-1]*111)%mod;
    }
    long long int st,dr,mij,ans=0;
    st=1;
    dr=n;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(vf(mij)==1)
        {
            ans=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
        for(int i=0; i<=100007; ++i)
        {
            numere[i].clear();
        }
    }
    fout<<ans;
    return 0;
}