Pagini recente » Cod sursa (job #222406) | Cod sursa (job #1082844) | Cod sursa (job #597951) | Cod sursa (job #216664) | Cod sursa (job #1188966)
#include <fstream>
#include <cstring>
#include <algorithm>
#define DIMN 17000
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
int n, kt, k, pas, val, Max;
int P[17][DIMN];
struct data {
int x;
int y;
int poz;
} L[DIMN];
pair<int,int> v[DIMN];
char A[DIMN];
int LCP (int i, int j) {
int res = 0;
if (i == j)
return n-i;
for (int k = pas; k >= 0 && i<n && j<n; --k)
if (P[k][i] == P[k][j]) {
i += (1<<k);
j += (1<<k);
res += (1<<k);
}
return res;
}
bool cmp (const data &a, const data &b) {
return a.x == b.y ? a.y < b.y : a.x < b.x;
}
int main() {
f>>n>>kt;
f.get();
f.get(A,DIMN);
for (int i = 0; A[i] != 0; ++i)
if (A[i]>='a' && A[i]<='z')
P[0][i] = A[i] - 'a';
else
if (A[i]>='A' && A[i]<='Z')
P[0][i] = A[i] - 'A' + 26;
else
P[0][i] = A[i] - '0' + 52;
for (pas = 1, k = 1; (k>>1) < n; ++pas, k <<= 1) {
for (int i = 0; i < n; ++i) {
L[i].x = P[pas-1][i];
L[i].y = (i + k < n) ? P[pas-1][i+k] : -1;
L[i].poz = i;
}
sort (L, L+n, cmp);
for (int i = 0; i < n; ++i)
if ( i>0 && L[i-1].x == L[i].x && L[i-1].y == L[i].y )
P[pas][L[i].poz] = P[pas][L[i-1].poz];
else
P[pas][L[i].poz] = i;
}
--pas;
for (int i = 0; i < n; ++i) {
v[i].first = P[pas][i];
v[i].second = i;
}
sort(v, v+n);
for (int i = 0; i<=n-kt; ++i) {
val = LCP ( v[i].second, v[i+kt-1].second );
Max = max (Max, val);
}
g<<Max<<"\n";
return 0;
}