Pagini recente » Cod sursa (job #1496680) | Cod sursa (job #977075) | Cod sursa (job #449838) | Cod sursa (job #1558965) | Cod sursa (job #1884868)
#include <fstream>
#include <cstring>
#include <map>
#define BASE 30
#define MOD 1000000009
#define DIM 20000
using namespace std;
ifstream f ("substr.in");
ofstream g ("substr.out");
int n, k, pw[DIM], h[DIM];
char s[DIM];
map <int, int> mp;
void prec () {
pw[0] = 1;
for (int i = 1; i <= n; ++i) {
pw[i] = (pw[i - 1] * BASE) % MOD;
h[i] = (h[i - 1] * BASE + (s[i] - 'a')) % MOD;
}
}
bool verif (int lg) {
mp.clear ();
mp[h[lg]] = 1;
for (int i = lg + 1; i <= n; ++i) {
long long qw = (h[i] - (h[i - lg] * pw[lg]) % MOD + MOD) % MOD;
++mp[(int) qw];
if (mp[(int) qw] >= k)
return 1;
}
return 0;
}
int cbin () {
int i, p = 0;
prec ();
for (i = 1; i <= n; i <<= 1);
while (i) {
if (i + p <= n && verif (i + p) == 1) {
p += i;
}
i >>= 1;
}
return p;
}
int main() {
f >> n >> k >> (s + 1);
g << cbin ();
return 0;
}