Pagini recente » Cod sursa (job #1610444) | Cod sursa (job #405477) | Cod sursa (job #394026) | Cod sursa (job #1219044) | Cod sursa (job #2401563)
#include <bits/stdc++.h>
#define Nmax 16390
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
int N, K;
int suff[15][Nmax];
char C[Nmax];
pair < pair <int, int>, int> P[Nmax];
int LCP[Nmax];
int sortedSuffixes[Nmax];
int getLCP(int a, int b)
{
int ret = 0;
for(int i = 14; i >= 0; i--)
if(suff[i][a] == suff[i][b])
{
ret += (1 << i);
a += (1 << i);
b += (1 << i);
}
return ret;
}
int main()
{
fin >> N >> K;
fin >> (C + 1);
for(int i = 1; i <= N; i++)
suff[0][i] = C[i];
for(int k = 1; k <= 14; k++)
{
for(int i = 1; i <= N; i++)
P[i] = make_pair(make_pair(suff[k - 1][i], (i + (1 << (k - 1)) <= N ? suff[k - 1][i + (1 << (k - 1))] : 0)), i);
sort(P + 1, P + N + 1);
int L = 1;
suff[k][P[1].second] = 1;
for(int i = 2; i <= N; i++)
if(P[i].first != P[L].first)
{
P[++L] = P[i];
suff[k][P[i].second] = L;
}
}
for(int i = 1; i <= N; i++)
sortedSuffixes[suff[14][i]] = i;
int ans = 0;
if(K == 1)
ans = N;
else
for(int i = 1; i + K - 1 <= N; i++)
ans = max(ans, getLCP(sortedSuffixes[i], sortedSuffixes[i + K - 1]));
fout << ans << "\n";
return 0;
}