Cod sursa(job #1984590)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 25 mai 2017 12:52:27
Problema Substr Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#define MOD1 91121
#define MOD2 666013

using namespace std;

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

int N, K, i, j;
int Prod1, Prod2;
int Hash1, Hash2;
string s;
vector < pair <int, int> > P;

bool Check(int L)
{
    int i, nr=1;
    P.clear();
    Prod1=Prod2=1;
    for (i=L-1; i>=0; i--)
    {
        Hash1+=Prod1*s[i];
        Hash2+=Prod2*s[i];
        Hash1%=MOD1;
        Hash2%=MOD2;
        if (i!=0)
        {
            Prod1*=199;
            Prod1%=MOD1;
            Prod2*=199;
            Prod2%=MOD2;
        }
    }
    P.push_back(make_pair(Hash1, Hash2));
    for (i=L; i<N; i++)
    {
        Hash1=(((((Hash1-Prod1*s[i-L]) % MOD1)+MOD1) % MOD1)+s[i]) % MOD1;
        Hash2=(((((Hash2-Prod1*s[i-L]) % MOD2)+MOD2) % MOD2)+s[i]) % MOD2;
        P.push_back(make_pair(Hash1, Hash2));
    }
    sort(P.begin(), P.end());
    if (nr==K)
      return true;
    for (i=1; i<P.size(); i++)
    {
        if (P[i]==P[i-1])
          nr++;
        else
          nr=1;
        if (nr==K)
          return true;
    }
    return false;
}

int Binary_Search()
{
    int be=1, en=N;
    int mid, ans=0;
    while (be<=en)
    {
        mid=(be+en) / 2;
        if (Check(mid)==true)
        {
            be=mid+1;
            ans=mid;
        }
        else
          en=mid-1;
    }
    return mid;
}

int main()
{
    fin >> N >> K;
    fin >> s;
    fout << Binary_Search() << '\n';
    fin.close();
    fout.close();
    return 0;
}