Cod sursa(job #2611885)

Utilizator As932Stanciu Andreea As932 Data 7 mai 2020 19:24:32
Problema Substr Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#include <cstring>
#include <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];
long long 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]=1LL*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]=1LL*hashh[i-1]*base+convert(arr[i]);
        hashh[i]%=MOD;
    }
}

bool ok(int len)
{
    map <long long,int> m;

    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]++;

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

    return false;
}

void solve()
{
    int st=1,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;
}