Pagini recente » Cod sursa (job #760734) | Cod sursa (job #107934) | Cod sursa (job #2405686) | Cod sursa (job #2219888) | Cod sursa (job #2949183)
#include <bits/stdc++.h>
using namespace std;
ifstream r("substr.in");
ofstream w("substr.out");
const int base = 103, mod = 666013;
int n, k;
unsigned long long put[16500], has[16500];
unordered_map <unsigned long long, int> m;
string s;
int get_val(char c)
{
if('a' <= c && c <= 'z')
{
return c - 'a' + 10;
}
if('A' <= c && c <= 'Z')
{
return c - 'A' + 36;
}
return c - '0';
}
bool check(int len)
{
m.clear();
for(int i = 1; i <= n - len + 1; i++)
{
unsigned long long aux = has[i + len - 1] - has[i - 1] * put[len];
m[aux]++;
}
for(auto it : m)
{
if(it.second >= k)
{
return 1;
}
}
return 0;
}
int main()
{
r >> n >> k;
r >> s;
s = '$' + s;
put[0] = 1;
for(int i = 1; i <= n; i++)
{
put[i] = put[i - 1] * base;
has[i] = has[i - 1] * base + get_val(s[i]);
}
int aux = 0;
for(int i = (1 << 28); i; i >>= 1)
{
if(aux + i <= n && check(aux + i))
{
aux += i;
}
}
w << aux << "\n";
return 0;
}