Cod sursa(job #1365273)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 28 februarie 2015 11:01:54
Problema Substr Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<bits/stdc++.h>
using namespace std;

struct cell
{
    int x,frecv;
};

ifstream fin("substr.in");
ofstream fout("substr.out");

const int baza=37;
const int MODULO=100007;
const int NMAX=20000;

int n,k,how[NMAX],put[NMAX];
char s[NMAX];
vector<cell>H[MODULO];
vector<cell>::iterator it;

inline int Add(int aux)
{
    for (it=H[aux].begin();it!=H[aux].end();it++)
        if ((*it).x==aux)
            {
                (*it).frecv++;
                return (*it).frecv;
            }
    cell k;
    k.x=aux;k.frecv=1;
    H[aux].push_back(k);
    return 1;
}

int main()
{
    int i,st,dr,mij,sol=0,aux;
    bool ok;
    fin>>n>>k;
    fin>>(s+1);
    put[0]=1;
    for (i=1;i<=n;i++)
        {
            put[i]=(put[i-1]*baza)%MODULO;
            if (s[i]>='0' && s[i]<='9') how[i]=s[i]-'0'+1;
            else
            if (s[i]>='a' && s[i]<='z') how[i]=s[i]-'a'+1+10;
            else
            if (s[i]>='A' && s[i]<='Z') how[i]=s[i]-'A'+1+36;
        }
    st=1;dr=NMAX;
    while (st<=dr)
        {
            mij=(st+dr)>>1;
            aux=ok=0;
            for (i=1;i<=n;i++)
                {
                    aux=(aux*baza+how[i])%MODULO;
                    if (i>mij)
                        {
                            aux-=(how[i-mij]*put[mij])%MODULO;
                            if (aux<0) aux+=MODULO;
                        }
                    if (Add(aux)>=k) ok=1;
                }
            if (ok==1) {sol=mij;st=mij+1;}
            else dr=mij-1;

            //golire
            for (i=0;i<MODULO;i++) H[i].clear();
        }
    fout<<sol<<"\n";
    return 0;
}