Cod sursa(job #1085997)

Utilizator laurionLaurentiu Ion laurion Data 17 ianuarie 2014 17:09:40
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#define nume "substr"

#ifndef INFOARENA
#define fisier "../algorithm solutions/" nume
#define DBG
#else
#define fisier nume
#endif

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <cassert>
#include <cstring>
#include <map>
#ifdef INFOARENA
#include <tr1/unordered_set>
#include <tr1/unordered_map>
using namespace std::tr1;
#else
#include <unordered_set>
#include <unordered_map>
#endif

using namespace std;

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

#ifdef DBG
#define fout cout
#endif

const int MAX_N = 16384 + 1;
const int BASE = 123;

int n,k;
string text;

int nr_aparitii(int len)
{
    unordered_map<int, int> H;
    int power = 1;
    int substr = 0;
    for(int i = 0; i < len; i ++){
        substr = (substr * BASE) + text[i];
    }
    for(int i = 0; i < len - 1; i ++){
        power *= BASE;
    }
    H[substr] = 1;
    for(int i = len; i < text.length(); i ++){
        substr -= power * (text[i - len]);
        substr = substr * BASE + text[i];
        ++H[substr];
        
#ifdef DBG
        cerr<<text.substr(i-len+1,len)<<' '<< H[substr]<<'\n';
#endif
    }
    return max_element(H.begin(), H.end(), [](decltype(*(H.begin())) a, decltype(*(H.begin())) b){
        return a.second < b.second;
    })->second;
}
int caut_bin(int st, int dr)
{
    if (dr < st) {
        return dr;
    }
    int m = (st+dr)/2;
    if(nr_aparitii(m) >= k)
        return caut_bin(m + 1, dr);
    return caut_bin(st, m - 1);
}
int main () {
    fin>>n>>k>>text;
    
    fout<<caut_bin(0, (int)text.length())<<'\n';
    
    return 0;
}