Cod sursa(job #1748887)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 27 august 2016 03:53:55
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cassert>
#include <map>
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
const int mod1 = 666013;
const int mod2 = 666019;
const int mod = 100019;
map <pair <int, int>, int> aparitii;
int n, k;
string s;
/*
inline void add(int x, int y)
{
    int x1 = x % mod;
    int y1 = y % mod;
    aparitii[x1].push_back(x, y);
}*/

bool verif(int m)
{
    //for(int i = 0; i < mod; i++)
     //   aparitii[i].clear();
    aparitii.clear();
    int q1 = 1, q2 = 1;
    int act1 = 0;
    int act2 = 0;
    for(int i = 0; i < m - 1; i++)
    {
        q1 = (q1 * 26) % mod1;
        q2 = (q2 * 26) % mod2;
    }
    for(int i = 0; i < m; i++)
    {
        act1 = (act1 * 26 + s[i] - 'a' + 1) % mod1;
        act2 = (act2 * 26 + s[i] - 'a' + 1) % mod2;
    }
    for(int i = m; i < n; i++)
    {
        if(++aparitii[make_pair(act1, act2)] == k)
            return 1;
        act1 = (act1 - q1 * (s[i - m] - 'a' + 1) % mod1 + mod1) % mod1;
        act2 = (act2 - q2 * (s[i - m] - 'a' + 1) % mod2 + mod2) % mod2;
        act1 = (act1 * 26 + s[i] - 'a' + 1) % mod1;
        act2 = (act2 * 26 + s[i] - 'a' + 1) % mod2;
    }
    if(++aparitii[make_pair(act1, act2)] == k)
        return 1;
    return 0;
}

int caut_bin()
{
    int st = 1;
    int dr = n;
    int ret = -1;
    while(st <= dr)
    {
        int mij = (st + dr) / 2;
        if(verif(mij))
        {
            ret = mij;
            st = mij + 1;
        }
        else
            dr = mij - 1;
    }
    return ret;
}

int main()
{
    in >> n >> k;
    getline(in, s);
    getline(in, s);
    out << caut_bin() << "\n";
    return 0;
}