Mai intai trebuie sa te autentifici.
Cod sursa(job #1884866)
Utilizator | Data | 19 februarie 2017 13:31:03 | |
---|---|---|---|
Problema | Substr | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.09 kb |
#include <fstream>
#include <cstring>
#define BASE 73
#define MOD1 666013
#define DIM 20000
using namespace std;
ifstream f ("substr.in");
ofstream g ("substr.out");
int n, k, mp[2 * MOD1];
char s[DIM];
bool verif (int lg) {
int h1 = 0, h2 = 0;
int p1 = 1, p2 = 1;
memset (mp, 0 , sizeof (mp));
for (int i = 1; i <= lg; ++i) {
h1 = (h1 * BASE + (s[i] - 'a')) % MOD1;
if (i != 1) {
p1 *= BASE;
p1 %= MOD1;
}
}
mp[h1] = 1;
for (int i = lg + 1; i <= n; ++i) {
long long qw;
qw = (((h1 - ((s[i - lg] - 'a') * p1) % MOD1 + MOD1) % MOD1) * BASE + (s[i] - 'a')) % MOD1;
h1 = (int) qw;
++mp[h1];
if (mp[h1] >= 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 >> (s + 1);
g << cbin ();
return 0;
}