Pagini recente » Cod sursa (job #2875272) | Cod sursa (job #2443499) | Cod sursa (job #2325686) | Cod sursa (job #2477436) | Cod sursa (job #356301)
Cod sursa(job #356301)
#include <fstream>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int SZ = 16384;
const int logSZ = 16;
struct entry { int a,b,p; };
bool operator< ( const entry &x, const entry &y ) { return x.a == y.a ? x.b < y.b : x.a < y.a; }
bool operator== ( const entry &x, const entry &y) { return x.a == y.a && x.b == y.b; }
ifstream fin("substr.in");
ofstream fout("substr.out");
int n,k;
string s;
entry v[SZ];
int msz;
int mat[logSZ][SZ];
int lcp[SZ];
void suffix_array() {
for (int i = 0; i < n; ++i) mat[0][i] = s[i];
msz = 1;
for (int cnt = 1; (cnt>>1) < n; ++msz, cnt <<= 1) {
for (int i = 0; i < n; ++i) {
v[i].a = mat[msz-1][i];
v[i].b = i + cnt < n ? mat[msz-1][i+cnt] : -1;
v[i].p = i;
}
sort(v,v+n);
for (int i = 0; i < n; ++i) {
mat[msz][v[i].p] = i > 0 && v[i] == v[i-1] ? mat[msz][v[i-1].p] : i;
}
}
--msz;
}
int LCP ( int x, int y ) {
if (x == y) return n-x;
int rez = 0;
for (int k = msz; k >= 0 && x < n && y < n; --k)
if (mat[k][x] == mat[k][y])
x += 1<<k, y += 1<<k, rez += 1<<k;
return rez;
}
int max_min_seq ( int k ) {
deque<int> Q;
int max = 0;
for (int i = 0; i < n; ++i) {
if (!Q.empty() && i >= k && Q.front() == lcp[i-k]) Q.pop_front();
while (!Q.empty() && Q.back() > lcp[i]) Q.pop_back();
Q.push_back(lcp[i]);
if (i >= k-1 && Q.front() > max)
max = Q.front();
}
return max;
}
int main() {
fin >> n >> k;
if (k == 1) {
fout << n << '\n';
return 0;
}
fin >> s;
suffix_array();
for (int i = 0; i < n-1; ++i) lcp[i] = LCP(v[i].p, v[i+1].p);
fout << max_min_seq(k-1) << '\n';
return 0;
}