Cod sursa(job #543722)

Utilizator teapatester teapa Data 28 februarie 2011 15:27:18
Problema Substr Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<fstream>
#include<cstdio>
#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];
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 main() 
{
   freopen("substr.in","r",stdin);
   freopen("substr.out","w",stdout);
	scanf("%d %d\n",&N,&k);
	
	fgets(A,17000,stdin);
    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]= -1000000000;
            L[i].p = i;
        }
        sort(L, L + N, cmp);
        for (int i = 0; i < N; ++i)
            if (i>0 && 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-k; i++)
		val=max (val, lcp(L[i].p,L[i+k-1].p));
	if (val>N) val=N;
	printf ("%d\n", val);
    return 0;
}