Pagini recente » Cod sursa (job #1198520) | Cod sursa (job #2948567) | Cod sursa (job #797913) | Cod sursa (job #30151) | Cod sursa (job #2933009)
/// Preset de infoarena
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int base = 103, mod = 666013;
int n, k;
unsigned long long pow[16500], hsh[16500];
unordered_map <unsigned long long, int> mp;
string str;
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)
{
mp.clear();
for(int i = 1; i <= n - len + 1; i++)
{
unsigned long long aux = hsh[i + len - 1] - hsh[i - 1] * pow[len];
mp[aux]++;
}
for(auto it : mp)
if(it.second >= k)
return 1;
return 0;
}
int main()
{
fin >> n >> k;
fin >> str;
str = '$' + str;
pow[0] = 1;
for(int i = 1; i <= n; i++)
{
pow[i] = pow[i - 1] * base;
hsh[i] = hsh[i - 1] * base + get_val(str[i]);
}
int aux = 0;
for(int i = (1 << 28); i; i >>= 1)
if(aux + i <= n && check(aux + i))
aux += i;
fout << aux << '\n';
return 0;
}