Pagini recente » Cod sursa (job #2150146) | Cod sursa (job #1668987) | Cod sursa (job #2290423) | Cod sursa (job #2832954) | Cod sursa (job #1417632)
#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;
}