Pagini recente » Cod sursa (job #2621537) | Cod sursa (job #401681) | Cod sursa (job #2318369) | Cod sursa (job #2657854) | Cod sursa (job #2966217)
#include <fstream>
#include <string>
#include <map>
#define int long long
using namespace std;
ifstream cin ("substr.in");
ofstream cout ("substr.out");
const int N = 16384;
const int MOD = 1e9 + 9;
int pref[N + 1], inv[N + 1];
int llpow (int a, int b)
{
int res = 1;
a = a % MOD;
while (b)
{
if (b & 1)res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res;
}
map <int, int> m;
string s;
int n, k;
bool ok (int dist)
{
m.clear();
for (int i = 0; i < s.size() - dist + 1; ++i)
{
int j = i + dist - 1;
int hashbun = pref[j];
if (i)
hashbun = (hashbun + MOD - pref[i - 1]) % MOD;
hashbun = hashbun * inv[i] % MOD;
m[hashbun]++;
}
for (auto it : m)
if (it.second >= k)
return 1;
return 0;
}
int cb (int st, int dr)
{
int last = 0;
while (st <= dr)
{
int med = (st + dr) >> 1;
if (ok (med))
{
st = med + 1;
last = med;
}
else
dr = med - 1;
}
return last;
}
int make (char ch)
{
if (isupper (ch))
return ch - 'A' + 1;
if (islower (ch))
return 'z' - 'a' + 2 + ch - 'a';
return ('z' - 'a' + 1) * 2 + ch - '0' + 1;
}
signed main()
{
cin >> n >> k >> s;
int p = 1;
int cat = llpow (71, MOD - 2);
inv[0] = cat;
for (int i = 0; i < s.size(); ++i, p = p * 71 % MOD)
{
pref[i] = p * make(s[i]) % MOD;
if (i)
pref[i] = (pref[i] + pref[i - 1]) % MOD, inv[i] = inv[i - 1] * cat % MOD;
}
cout << cb (1, n) << '\n';
return 0;
}