Pagini recente » Cod sursa (job #2368052) | Cod sursa (job #215532) | Cod sursa (job #1294891) | Cod sursa (job #2859645) | Cod sursa (job #418843)
Cod sursa(job #418843)
using namespace std;
#include<cstring>
#include<fstream>
const int MAX_N = 16384, MAX_K = 16;
int P[MAX_K][MAX_N];
int N, stp, K;
char S[MAX_N];
struct elem { int nr[2], p; };
struct cmp
{
bool operator()(const elem &a, const elem &b)const
{
return a.nr[0] == b.nr[0]? (a.nr[1] < b.nr[1]): (a.nr[0]<b.nr[0]);
}
};
elem L[MAX_N];
int lcp(int x, int y)
{
if(x == y) return N-x;
int ret = 0, k;
for(k = stp; k>=0 && x< N && y < N; --k)
if(P[k][x] == P[k][y])
x+=1<<k, y+=1<<k, ret+=1<<k;
return ret;
}
int ord[MAX_N], SOL;
int main()
{
ifstream in("substr.in"); ofstream out("substr.out");
in>>N>>K;
in>>S;
int i, cnt, tmp;
for(i = 0; i < N; ++i)
P[0][i] = S[i] - 'a';
for(cnt = stp = 1; cnt >> 1 < N; ++stp, cnt<<=1)
{
for(i = 0; i < N; ++i)
{
L[i].nr[0] = P[stp-1][i];
L[i].nr[1] = i+cnt<N? P[stp-1][i+cnt]:-1;
L[i].p = i;
}
sort(L, L+N, cmp());
for(i = 0; i < N; ++i)
P[stp][ L[i].p ] = i > 0 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1]?
P[stp][L[i-1].p]: i;
}
--stp;
for(i = 0; i < N; ++i)
ord[ P[stp][i] ] = i;
for(i = 0; i < N - K; ++i)
{
tmp = lcp( ord[i], ord[i+K-1] );
if(tmp > SOL) SOL = tmp;
}
out<<SOL<<"\n";
}