Pagini recente » Cod sursa (job #986277) | Cod sursa (job #505159) | Cod sursa (job #2490659) | Cod sursa (job #676080) | Cod sursa (job #545001)
Cod sursa(job #545001)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 16388, logN = 15;
int n, k, line;
int lcp[logN][N];
char text[N];
vector < pair< int,pair<int,int> > > vFind;
void Read()
{
scanf("%d%d\n",&n,&k);
gets(text);
}
int Compare( pair< int,pair<int,int> > a, pair< int,pair<int,int> > b)
{
if (a.second.first == b.second.first)
return a.second.second < b.second.second;
return a.second.first < b.second.first;
}
void GetCurrentLCP(int curLine)
{
int count = 1;
lcp[curLine][vFind[0].first] = 1;
for (int i = 1; i<n; ++i)
{
if ( (vFind[i].second.first != vFind[i-1].second.first) || (vFind[i].second.second != vFind[i-1].second.second) )
++count;
lcp[curLine][vFind[i].first] = count;
}
}
void GenerateLCP()
{
for (int i = 0; i < n; ++i)
lcp[0][i] = text[i];
int put;
for (line = 1, put = 2; put < n; ++line, put <<= 1)
{
for (int i = 0; i < n; ++i)
{
pair <int,int> a;
a.first = lcp[line-1][i];
a.second = lcp[line-1][i + (put/2)];
vFind.push_back(make_pair(i, a));
}
sort(vFind.begin(), vFind.end(), Compare);
GetCurrentLCP(line);
vFind.clear();
}
line--;
}
int GetLCP(int i, int j)
{
int result = 0;
for (int curLine = line; curLine >= 0 && i < n && j < n; --curLine)
if (lcp[curLine][i] == lcp[curLine][j])
{
int put = 1 << curLine;
i += put;
j += put;
result += put;
}
return result;
}
void GetAnswer()
{
int rAct, result = 0;
for (int i = 0; i <= n-k; ++i)
{
rAct = GetLCP(i, i+k-1);
if (rAct > result)
result = rAct;
}
printf("%d\n",result);
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
Read();
GenerateLCP();
GetAnswer();
return 0;
}