Pagini recente » Cod sursa (job #1498497) | Cod sursa (job #1855287) | Cod sursa (job #977105) | Cod sursa (job #1371968) | Cod sursa (job #1884861)
#include <fstream>
#include <map>
#define BASE 73
#define MOD1 561307
#define MOD2 666013
#define DIM 20000
using namespace std;
ifstream f ("substr.in");
ofstream g ("substr.out");
int n, k, v[DIM];
char sir[DIM];
map <pair <int, int>, int> mp;
bool verif (int lg) {
int h1 = 0, h2 = 0;
int p1 = 1, p2 = 1;
mp.clear ();
for (int i = 1; i <= lg; ++i) {
h1 = (h1 * BASE + v[i]) % MOD1;
h2 = (h2 * BASE + v[i]) % MOD2;
if (i != 1) {
p1 *= BASE;
p1 %= MOD1;
p2 *= BASE;
p2 %= MOD2;
}
}
mp[make_pair (h1, h2)] = 1;
for (int i = lg + 1; i <= n; ++i) {
long long qw;
qw = (((h1 - (v[i - lg] * p1) % MOD1 + MOD1) % MOD1) * BASE + v[i]) % MOD1;
h1 = (int) qw;
qw = (((h2 - (v[i - lg] * p2) % MOD2 + MOD2) % MOD2) * BASE + v[i]) % MOD2;
h2 = (int) qw;
++mp[make_pair (h1, h2)];
if (mp[make_pair (h1, h2)] >= k)
return 1;
}
return 0;
}
int cbin () {
int i, p = 0;
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 >> (sir + 1);
for (int i = 1; i <= n; ++i) {
if (sir[i] >= '0' && sir[i] <= '9')
v[i] = sir[i] - '0';
if (sir[i] >= 'a' && sir[i] <= 'z')
v[i] = sir[i] - 'a' + 10;
if (sir[i] >= 'A' && sir[i] <= 'Z')
v[i] = sir[i] - 'A' + 26;
}
g << cbin ();
return 0;
}