Pagini recente » Cod sursa (job #1311296) | Cod sursa (job #404656) | Cod sursa (job #210889) | Cod sursa (job #2455319) | Cod sursa (job #2401550)
#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 <int, int> P[Nmax];
int LCP[Nmax];
int sortedSuffixes[Nmax];
deque <int> DQ;
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(suff[k - 1][i], (i + (1 << (k - 1)) <= N ? suff[k - 1][i + (1 << (k - 1))] : 0));
sort(P + 1, P + N + 1);
int L = 1;
for(int i = 2; i <= N; i++)
if(P[i] != P[L])
P[++L] = P[i];
for(int i = 1; i <= N; i++)
{
pair <int, int> q = make_pair(suff[k - 1][i], (i + (1 << (k - 1)) <= N ? suff[k - 1][i + (1 << (k - 1))] : 0));
suff[k][i] = lower_bound(P + 1, P + L + 1, q) - P;
}
}
for(int i = 1; i <= N; i++)
sortedSuffixes[suff[14][i]] = i;
for(int i = 1; i < N; i++)
LCP[i] = getLCP(sortedSuffixes[i], sortedSuffixes[i + 1]);
int ans = 0;
if(K == 1)
ans = N;
else
for(int i = 2; i <= N; i++)
{
while(!DQ.empty() && LCP[DQ.back()] >= LCP[i - 1])
DQ.pop_back();
DQ.push_back(i - 1);
if(DQ.front() == i - K)
DQ.pop_front();
if(i >= K)
ans = max(ans, LCP[DQ.front()]);
}
fout << ans << "\n";
return 0;
}