Cod sursa(job #1866575)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 3 februarie 2017 12:29:59
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <unordered_map>

using namespace std;

const int nMax = 16400;
const long long base = 30;
const long long MOD = (1LL << 30) + 7;

int n, k;
char s[nMax];
int rasp = 0;
long long Hash[nMax];
long long basePow[nMax];

void citire()
{
    ifstream in("substr.in");
    in >> n >> k;
    in >> (s + 1);
}

void SetBasePow()
{
    basePow[0] = 1;
    for(int i = 1; i <= n; ++i)
        basePow[i] = (basePow[i - 1] * base) % MOD;
}

void SetHash()
{
    for(int i = 1; i <= n; ++i)
        Hash[i] = (Hash[i - 1] * base + (s[i] - 'a')) % MOD;
}

long long GetHash(int st, int dr)
{
    long long ret = Hash[dr] - (Hash[st - 1] * basePow[dr - st + 1]) % MOD;
    if(ret < 0)
        ret += MOD;
    return ret;
}

bool test(int x)
{
    unordered_map<long long, int> ap;
    int st, dr;
    long long hs;
    for(dr = x; dr <= n; ++dr)
    {
        st = dr - x + 1;
        hs = GetHash(st, dr);
        ap[hs]++;
        if(ap[hs] >= k)
            return true;
    }
    return false;
}

void rezolvare()
{
    SetHash();
    SetBasePow();
    int st = 1, dr = n, mid;
    while(st <= dr)
    {
        mid = (st + dr) / 2;
        if(test(mid))
        {
            rasp = max(rasp, mid);
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }
}

void afisare()
{
    ofstream out("substr.out");
    out << rasp;
}

int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}