Pagini recente » Cod sursa (job #1314584) | Cod sursa (job #818786) | Cod sursa (job #1558683) | Cod sursa (job #809418) | Cod sursa (job #2965672)
#include <fstream>
#include <vector>
#include <map>
#include <climits>
using namespace std;
const int NMAX = 16384;
const int MOD = 1e9 + 7;
const int P = 67;
int h[NMAX + 1];
int inv[NMAX + 1];
int pwr(int a, int b)
{
int ans = 1;
while (b)
{
if (b & 1)
ans = 1LL * ans * a % MOD;
a = 1LL * a * a % MOD;
b >>= 1;
}
return ans;
}
int has(int i, int j)
{
return 1LL * (h[j] - h[i - 1] + MOD) % MOD * inv[i] % MOD;
}
int n, k;
map <int, int> mp;
bool ok(int val)
{
mp.clear();
int i;
for (i = 1; i + val - 1 <= n; i++)
{
int cine = has(i, i + val - 1);
mp[cine]++;
if (mp[cine] >= k)
return 1;
}
return 0;
}
int cod(char x)
{
if (x >= 'a' and x <= 'z')
return x - 'a' + 1;
if (x >= 'A' and x <= 'Z')
return 'z' - 'a' + 1 + x - 'A' + 1;
return 'z' - 'a' + 1 + 'Z' - 'A' + 1 + x - '0' + 1;
}
signed main()
{
ifstream cin("substr.in");
ofstream cout("substr.out");
int i;
cin >> n >> k;
int p = P;
int needed = pwr(P, MOD - 2);
inv[0] = 1;
for (i = 1; i <= n; i++)
{
char x;
cin >> x;
h[i] = 1LL * (h[i - 1] + 1LL * cod(x) * p % MOD) % MOD;
inv[i] = 1LL * inv[i - 1] * needed % MOD;
p = 1LL * p * P % MOD;
}
int med, st = 1, dr = n, sol = -1;
while (st <= dr)
{
med = ((st + dr) >> 1);
if (ok(med))
{
sol = med;
st = med + 1;
}
else
dr = med - 1;
}
cout << sol;
}