Cod sursa(job #2611900)

Utilizator As932Stanciu Andreea As932 Data 7 mai 2020 19:45:44
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <cstring>
#include <unordered_map>

using namespace std;

ifstream cin("substr.in");
ofstream cout("substr.out");

const int nmax=17000;
const int base=97;
const int MOD=1e9+7;

int n,k;
char arr[nmax];
int pw[nmax],hashh[nmax];
long long aux;
unordered_map <int,int> m;

void read()
{
    cin>>n>>k;
    cin>>(arr+1);
}

int convert(char ch)
{
    ////ordinea --> abcdef...zABCDEF..Z01234..9

    if(ch>='a' && ch<='z')
        return (ch-'a');
    else if(ch>='A' && ch<='Z')
        return (ch-'A'+26);//A va fi al 27-lea character

    return (ch-'0'+52);//0 va fi al 53-lea
}

void power()
{
    pw[0]=1;

    for(int i=1;i<=n;i++)
    {
        aux=1LL*pw[i-1]*base;
        pw[i]=aux%MOD;

        aux=1LL*hashh[i-1]*base+convert(arr[i]);
        hashh[i]=aux%MOD;
    }
}

bool ok(int len)
{
    m.clear();
    for(int i=1;i<=n-len+1;i++)
    {
        long long h=hashh[i+len-1]-1LL*hashh[i-1]*pw[len];

        h%=MOD;

        if(h<0)h+=MOD;

        m[h]++;
    }

    for(const auto& x : m)
        if(x.second>=k)
            return true;

    return false;
}

void solve()
{
    int st=0,dr=n/k,mij,sol=0;

    while(st<=dr)
    {
        mij=(st+dr)/2;

        if(ok(mij))
        {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }

    cout<<sol;
}

int main()
{
    read();

    if(k==1)
    {
        cout<<n;
        return 0;
    }
    else if(k==n)
    {
        cout<<"1";
        return 0;
    }

    power();
    solve();

    return 0;
}