Cod sursa(job #1804804)

Utilizator ade_tomiEnache Adelina ade_tomi Data 13 noiembrie 2016 00:26:24
Problema Substr Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 16500;
const int MOD1 = 100007;
const int MOD2 = 100021;
vector <pair<int,int> > v;
string s;
int n, k;
int ok(int p)
{
    int h1 = 0, h2 = 0, put1 = 1, put2 = 1;
    for (int i = 0; i < p ; i++)
    {
        h1 = (h1 + (s[i] - 'a') * put1) % MOD1;
        h2 = (h2 + (s[i] - 'a') * put2) % MOD2;
        put1 = (put1 * 26) % MOD1;
        put2 = (put2 * 26) % MOD2;
    }
    v.push_back({h1, h2});
    for (int i = p; i < s.size(); i++)
    {
        h1 = (h1 - (s[i - p] - 'a')) / 26 + (s[i] - 'a') * put1;
        h2 = (h2 - (s[i - p] - 'a')) / 26 + (s[i] - 'a') * put2;
        h1 = h1 % MOD1;
        h2 = h2 % MOD2;
        if (h1 < 0)
            h1 += MOD1;
        if (h2 < 0)
            h2 += MOD2;
        v.push_back({h1, h2});

    }
    sort(v.begin(), v.end());
    int ap = 1;
    for (int i = 1; i < v.size(); i++)
        if(v[i].first == v[i - 1].first && v[i].second == v[i-1].second)
        {
            ap++;
            if (ap >= k)
                return 1;
        }
        else
            ap = 1;
    if (k == 1)
        return 1;
    return 0;
}
int main ()
{
    ifstream cin ("substr.in");
    ofstream cout ("substr.out");
    cin >> n >> k;
    cin >> s;
    int l1 = 1, sol = 0;
    int l2 = s.size();
    while (l1 <= l2)
    {
        int mid = (l1 + l2) / 2;
        if (ok(mid))
        {
            sol = mid;
            l1 = mid + 1;
        }
        else l2 = mid  - 1;
    }
    cout << sol ;
    return 0;
    
}