Pagini recente » Cod sursa (job #341661) | Cod sursa (job #1840590) | Cod sursa (job #2317120) | Cod sursa (job #2775338) | Cod sursa (job #2641691)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("substr.in");
ofstream g ("substr.out");
constexpr int NMAX = 16390;
int N, K;
char sir[ NMAX ];
int lg[ NMAX ];
int order[ NMAX ];
int Suffix[20][NMAX];
pair <pair <int, int>, int> Key[NMAX];
void Suffix_Array () {
lg[1] = 0;
for (int i = 2; i <= N; ++ i ) {
lg[ i ] = lg[ i / 2 ] + 1;
}
for (int i = 1; i <= N; ++ i ) {
Suffix[0][i] = sir[i] - '0' + 1;
}
for (int i = 1; i <= lg[ N ] + 2; ++ i ) {
for (int j = 1; j <= N; ++ j ) {
Key[ j ] = {{Suffix[i-1][j], (j + (1<<(i-1)) <= N ? Suffix[i-1][j+(1<<(i-1))] : 0)}, j};
}
sort(Key + 1, Key + N + 1);
int cnt = 0;
for (int j = 1; j <= N; ++ j ) {
if (Key[j].first != Key[j-1].first) {
++ cnt;
}
Suffix[i][Key[j].second] = cnt;
}
}
}
int LCP (int i, int j) {
int ans = 0, M = N - max(i, j) + 1;
for (int p = lg[M]; p >= 0 && i <= N && j <= N; -- p ) {
if (Suffix[p][i] == Suffix[p][j]) {
ans += (1<<p);
i += (1<<p);
j += (1<<p);
}
}
return ans;
}
int main()
{
f >> N >> K;
if (K == 1) {
g << N << '\n';
return 0;
}
for (int i = 1; i <= N; ++ i ) {
f >> sir[ i ];
}
Suffix_Array();
for (int i = 1; i <= N; ++ i ) {
order[Suffix[lg[N]+2][i]] = i;
}
int sol = 0;
for (int i = 1; i <= N; ++ i ) {
sol = max(sol, LCP(order[i], order[i+K-1]));
}
g << sol << '\n';
return 0;
}