Pagini recente » Cod sursa (job #499115) | Cod sursa (job #1730782) | Cod sursa (job #2894754) | Cod sursa (job #1455169) | Cod sursa (job #2733832)
#include <fstream>
#include <unordered_map>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
const int mod = 2e9 + 11;
const int sigma = 62;
int n, k;
string s;
int 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 < int, int > cnt;
int h = 0, p = 1;
for (int i = 0 ; i < value; i++)
{
h = (1LL * h * sigma + ind[s[i]]) % mod;
if (i > 0)
p = (1LL * p * sigma) % mod;
}
cnt[h]++;
for (int i = value; i < s.size(); i++)
{
h = (1LL * h + mod - (1LL * ind[s[i - value]] * p) % mod) % mod;
h = (1LL * h * sigma + 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;
}