Pagini recente » Cod sursa (job #2146791) | Cod sursa (job #2470200) | Borderou de evaluare (job #1036018) | Cod sursa (job #2839708) | Cod sursa (job #2733838)
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
const long long mod = 999999999989;
const long long base = 211;
int n, k;
string s;
long long ind[128];
void init()
{
int p = 0;
for (char c = 'a'; c <= 'z'; c++, p++)
ind[c] = p;
for (char c = 'A'; c <= 'Z'; c++, p++)
ind[c] = p;
for (char c = '0'; c <= '9'; c++, p++)
ind[c] = p;
}
bool ok(int value)
{
unordered_map < long long, int > cnt;
long long h = 0, p = 1;
for (int i = 0 ; i < value; i++)
{
h = (h * base + ind[s[i]]) % mod;
if (i > 0)
p = (p * base) % mod;
}
cnt[h]++;
for (int i = value; i < s.size(); i++)
{
h = (h + mod - (p * ind[s[i - value]]) % mod) % mod;
h = (h * base + ind[s[i]]);
cnt[h]++;
}
for (auto it : cnt)
if (it.second >= k)
return true;
return false;
}
int main()
{
init();
f >> n >> k >> s;
int ans = 0;
int left = 1, right = s.size() / k;
while (left <= right)
{
int mid = (left + right) / 2;
if (ok(mid))
{
ans = mid;
left = mid + 1;
}
else
right = mid - 1;
}
g << ans << "\n";
return 0;
}