Cod sursa(job #1500916)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 12 octombrie 2015 21:24:18
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <fstream>
#include <map>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int N,K;
const int MOD1 = 1000007;
const int MOD2 = 1000021;
const int Base = 73;
char Str[16385];
int Code[155];
bool ok=0;
map <pair<int,int>,int> M;
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[make_pair(h1,h2)]++;
    if(M[make_pair(h1,h2)]>=K)
        ok=1;
}
void Read()
{
    f>>N>>K;
    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=1,p2=1;
    for(int i=1;i<length;i++)
    {
        p1*=Base;
        p2*=Base;
        p1%=MOD1;
        p2%=MOD2;
    }
    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;
    }
    M.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;
}