Pagini recente » Cod sursa (job #589079) | Cod sursa (job #676044) | Cod sursa (job #2775596) | Cod sursa (job #3039780) | Cod sursa (job #1065158)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int mod = 10007;
vector< pair<int, int> > hs[mod];
inline int add(const int& val) {
const int line = val % mod;
for (int i = 0; i < hs[line].size(); ++i) {
if (hs[line][i].first == val) {
return ++hs[line][i].second;
}
}
hs[line].push_back(make_pair(val, 1));
return 1;
}
inline void clear() {
for (int i = 0; i < mod; ++i) {
while (hs[i].size()) {
hs[i].pop_back();
}
}
}
inline int make(const int& a, const int& b) {
return a * 10000 + b;
}
const int MAX = 16400;
int n, k;
char a[MAX];
const int key1 = 257, key2 = 253;
const int mod1 = 9931, mod2 = 9227;
inline bool check(const int& len) {
clear();
int p1 = 1, p2 = 1, x1 = 0, x2 = 0;
for (int i = 1; i <= n; ++i) {
x1 = x1 * key1 + a[i];
x1 = x1 % mod1;
x2 = x2 * key2 + a[i];
x2 = x2 % mod2;
if (i >= len) {
if (add(make(x1, x2)) == k) {
return true;
}
x1 = x1 - p1 * a[i - len + 1];
x1 %= mod1; x1 = x1 + mod1 * (x1 < 0);
x2 = x2 - p2 * a[i - len + 1];
x2 %= mod2; x2 = x2 + mod2 * (x2 < 0);
} else {
p1 *= key1; p1 %= mod1;
p2 *= key2; p2 %= mod2;
}
}
return false;
}
inline int binsrc() {
int i = 0, cnt = 1 << 16;
for (; cnt; cnt >>= 1) {
if (i + cnt <= n && check(i + cnt)) {
i += cnt;
}
}
return i;
}
int main() {
ifstream fin("substr.in");
fin >> n >> k;
fin >> a + 1;
fin.close();
#ifdef INFOARENA
ofstream fout("substr.out");
fout << binsrc() << '\n';
fout.close();
#else
cout << binsrc() << '\n';
#endif
}