Pagini recente » Cod sursa (job #1264773) | Cod sursa (job #1927765) | Cod sursa (job #2433400) | Cod sursa (job #849274) | Cod sursa (job #1053706)
#include <stdio.h>
#include <unordered_map>
#define baza 131
#define mod 9500041
using namespace std;
FILE*f = fopen("substr.in", "r");
FILE*g = fopen("substr.out", "w");
int n, k;
char v[20001];
unordered_map <int, int> h;
long long X, Y;
void euclid(int a, int b, long long &x, long long &y){
if (!b){
x = 1;
y = 0;
return;
}
else{
long long x0, y0;
euclid(b, a%b, x0, y0);
x = y0;
y = x0 - (a / b)*y0;
}
}
long long invers(int a)
{
X = Y = 0;
euclid(a, mod, X, Y);
while (X <= 0)
X = mod + X%mod;
return X;
}
int main()
{
fscanf(f, "%d%d\n", &n, &k);
fgets(v + 1, n + 3, f);
int p = 0;
int u = n;
int BAZA = invers(baza);
while (p <= u)
{
int ok = 0;
int m = (p + u) / 2;
int b = 1;
long long nr = 0;
nr = v[1];
for (int i = 2; i <= m; ++i)
{
b *= baza;
b %= mod;
nr += v[i] * b;
nr %= mod;
}
h[nr]++;
if (k == 1)
ok = 1;
for (int i = m + 1; !ok&&i <= n; ++i)
{
nr += mod - v[i - m];
nr %= mod;
nr *= BAZA;
nr %= mod;
nr += v[i] * b;
nr %= mod;
h[nr]++;
if (h[nr] >= k)
{
ok = 1;
}
}
if (ok)
p = m + 1;
else
u = m - 1;
h.clear();
}
fprintf(g, "%d", u);
fclose(f);
fclose(g);
return 0;
}