Cod sursa(job #2547040)

Utilizator stefantagaTaga Stefan stefantaga Data 14 februarie 2020 21:17:20
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>
#define MOD 1000000007
#define baza 101
#define MOD2 100000009
#define baza2 103
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
long long v[16385],k,n,putere[16385];
char ch;
const int modul=100007;
vector <pair <int,int> >  numere[100010];
void add (int val)
{
    int i,ok=0,poz;
    poz=val%modul;
    for (i=0;i<numere[poz].size();i++)
    {
        if (numere[poz][i].first==val)
        {
            numere[poz][i].second++;
            ok=1;
            break;
        }
    }
    if (ok==0)
    {
        numere[poz].push_back({val,1});
    }
}
int cat (int val)
{
    int i,poz;
    poz=val%modul;
    for (i=0;i<numere[poz].size();i++)
    {
        if (numere[poz][i].first==val)
        {
            return numere[poz][i].second;
        }
    }
    return 0;
}
bool ok (long long lung)
{
    long long nr=0,i;
    for (i=1;i<=lung;i++)
    {
        nr=(1LL*nr*baza+v[i])%MOD;
    }
    add(nr);
    if (cat(nr)>=k)
    {
        return 1;
    }
    for (i=lung+1;i<=n;i++)
    {
        nr=(nr-(putere[lung-1]*v[i-lung])%MOD+MOD)%MOD;
        nr=(1LL*nr*baza+v[i])%MOD;
        add(nr);
    if (cat(nr)>=k)
    {
        return 1;
    }
    }
    return 0;
}
long long i,st,dr,mij,sol;
int main()
{
    f>>n>>k;
    putere[0]=1;
    for (i=1;i<=n;i++)
    {
        f>>ch;
        v[i]=int(ch)-48;
        putere[i]=(1LL*putere[i-1]*baza)%MOD;
    }
    st=1;
    dr=n;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (ok(mij)==1)
        {
            sol=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
        for (i=0;i<=100007;i++)
        {
            numere[i].clear();
        }
    }
    g<<sol;
    return 0;
}