Cod sursa(job #1500928)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 12 octombrie 2015 21:34:09
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <map>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int N,K;
const int MOD1 = 100007;
const int MOD2 = 100021;
const int Base = 73;
char Str[16385];
int Code[155];
int Power1[16385],Power2[16385];
bool ok=0;
map <int,int> M[MOD1];
void Insert(int h1,int h2)
{
    /*if(M.count(make_pair(h1,h2))==0)
        M.insert(make_pair(make_pair(h1,h2),1));
    else*/
    M[h1][h2]++;
    if(M[h1][h2]>=K)
        ok=1;
}
void Read()
{
    f>>N>>K;
    Power1[0]=Power2[0]=1;
    for(int i=1;i<=N;i++)
        Power1[i]=Power1[i-1]*Base,Power1[i]%=MOD1,Power2[i]=Power2[i-1]*Base,Power2[i]%=MOD2;
    char ch;
    f.get(ch);
    f.getline(Str,16385);
    for(int i=0;i<=9;i++)
        Code[i+'0']=i;
    for(int i='A';i<='Z';i++)
        Code[i]=i-'A'+10;
    for(int i='a';i<='z';i++)
        Code[i]=i-'a'+36;
}

int Solve(int length)
{
    int h1=0,h2=0,p1=Power1[length-1],p2=Power2[length-1];
    for(int i=0;i<length;i++)
    {
        h1=h1*Base+Code[Str[i]];
        h1%=MOD1;
        h2=h2*Base+Code[Str[i]];
        h2%=MOD2;
    }
    Insert(h1,h2);
    for(int i=length;i<N;i++)
    {
        h1-=p1*Code[Str[i-length]];
        h2-=p2*Code[Str[i-length]];
        h1%=MOD1;
        h1+=MOD1;
        if(h1>=MOD1)
            h1-=MOD1;
        h2%=MOD2;
        h2+=MOD2;
        if(h2>=MOD2)
            h2-=MOD2;
        h1=h1*Base+Code[Str[i]];
        h1%=MOD1;
        h2=h2*Base+Code[Str[i]];
        h2%=MOD2;
        Insert(h1,h2);
        if(ok==1)
            break;
    }
    for(int i=0;i<MOD1;i++)
        M[i].clear();
    return ok;
}
void binSearch()
{
    int left=1,right=N,mid,sol=0;
    while(left<=right)
    {
        mid=(left+right)/2;
        if(Solve(mid)==1)
        {
            sol=mid;
            left=mid+1;
        }
        else
            right=mid-1;
        ok=0;
    }
    g<<sol<<"\n";
}
int main()
{
    Read();
    binSearch();
    return 0;
}