Cod sursa(job #1417632)

Utilizator ZenusTudor Costin Razvan Zenus Data 10 aprilie 2015 18:15:18
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <string>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

#define NMAX 16390

ifstream f("substr.in");
ofstream g("substr.out");

string str;
map < pair < int , int > , int > w;
pair < int , int > codQ;
int le,ri,len,sol,N,K,p[2],cod[2];
const int base[] = {137,141};
const int MOD[] = {666013,512731};

bool check(int len)
{
    w.clear();

    // p[k] = base[k] ^ len

    cod[0] = cod[1] = 0;
    p[1] = p[0] = 1;


    for (int i=0;i<len;++i)
    for (int k=0;k<=1;++k)
    {
        cod[k] = ( 1ll * cod[k] * base[k] + str[i]) % MOD[k];
        p[k] = (1ll * p[k] * base[k]) % MOD[k];
    }

    codQ = {cod[0] , cod[1]};
    w[codQ] = 1;
    if (w[codQ] >= K) return true;

    for (int i=len;i<N;++i)
    {
        for (int k=0;k<=1;++k)
        {
            cod[k] = (1ll * cod[k] * base[k] + str[i]) % MOD[k];
            cod[k] = (cod[k] - ( (1ll * p[k] * str[i - len]) % MOD[k] ) + MOD[k]) % MOD[k];
        }

        codQ = {cod[0] , cod[1]};
        w[codQ] += 1;
        if (w[codQ] >= K) return true;
    }

    return false;
}

int main()
{

f >> N >> K >> str;

le = 1 ; ri = N ;

while (le <= ri)
{
    len = (le + ri) >> 1;

    if (check(len))
    {
        le = len + 1;
        sol = len;
    } else ri = len - 1;
}

g << sol << '\n';

return 0;
}