Pagini recente » Cod sursa (job #1691381) | Cod sursa (job #1342494) | Cod sursa (job #2784780) | Cod sursa (job #732978) | Cod sursa (job #1866575)
#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;
}