Cod sursa(job #2611871)

Utilizator As932Stanciu Andreea As932 Data 7 mai 2020 19:17:19
Problema Substr Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int nmax=17000;
const int base=97;
const int MOD=100799;

int n,k;
char arr[nmax];
int fq[MOD+1],pw[nmax],hashh[nmax];

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

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

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

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
    else if(ch>='0' && ch<='9')
        return (ch-'0'+52);//0 va fi al 53-lea
    return 0;
}

void hsh()
{
    for(int i=1;i<=n;i++)
    {
        hashh[i]=hashh[i-1]*base+convert(arr[i]);
        hashh[i]%=MOD;
    }
}

bool ok(int len)
{
    memset(fq,0,sizeof(fq));

    for(int i=1;i<=n-len+1;i++)
    {
        int h=hashh[i+len-1]-hashh[i-1]*pw[len];

        h%=MOD;

        if(h<0)h+=MOD;

        fq[h]++;

        if(fq[h]>=k)
            return true;
    }

    return false;
}

void solve()
{
    int st=0,dr=n,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();
    power();
    hsh();
    solve();

    return 0;
}