Cod sursa(job #543689)

Utilizator teapatester teapa Data 28 februarie 2011 14:59:04
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define MAXN 17000
using namespace std;
ifstream f1 ("substr.in");
ofstream f2 ("substr.out");
char A[MAXN];
struct entry 
{
	int nr[2], p;
} L[MAXN];
struct ab 
{
	int x, y;
} V[MAXN];
int P[20][MAXN], N,k, i, stp, cnt;
bool cmp(const entry &a, const entry &b) 
{
    if (a.nr[0]!=b.nr[0]) return a.nr[0]<b.nr[0];
		else return a.nr[1]<b.nr[1];
}
int lcp (int a, int b)
{
	int rez=0;
	for (int i=stp-1; i>=0 && a<N&& b<N; --i)
		if (P[i][a]==P[i][b])
			a+=1<<i, b+=1<<i, rez+=1<<i;
	return rez;
}
int cmp2 (ab a, ab b)
{
	if (a.x!=b.x) return a.x<b.x;
		else return a.y<b.y;
}
int main() 
{
    f1>>N>>k;
	for (int i=0; i<N; i++) f1>>A[i];
	for (int i=0; i<N; i++) P[0][i]=A[i]-'a';
    for (stp = 1, cnt = 1; cnt >> 1 < N; ++stp, cnt <<= 1) 
	{
        for (int i = 0; i < N; ++i) 
		{
            L[i].nr[0] = P[stp - 1][i];
			if (i+cnt<N) L[i].nr[1]= P[stp - 1][i + cnt];
				else L[i].nr[1]= -1;
            L[i].p = i;
        }
        sort(L, L + N, cmp);
        for (int i = 0; i < N; ++i)
            if (L[i].nr[0]==L[i - 1].nr[0]&&L[i].nr[1]==L[i - 1].nr[1])	
				P[stp][L[i].p]=P[stp][L[i - 1].p];
				else  P[stp][L[i].p]=i;
    }
	
	int val=0;
	for (int i=0; i<N; i++) V[i].x=P[stp-1][i], V[i].y=i;
	sort(V, V+N, cmp2);
	for (int i=0; i<=N-k; i++)
		val=max (val, lcp(V[i].y, V[i+k-1].y));
	f2<<val<<"\n";
    return 0;
}