Cod sursa(job #916487)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 16 martie 2013 16:17:36
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

#define NMAX 16385
#define LMAX 16

struct entry {
	int nr[2],poz;
};

struct cmp {
	bool operator () (const entry &a, const entry &b) {
		if(a.nr[0]==b.nr[0])
			return a.nr[1]<b.nr[1];
		return a.nr[0]<b.nr[0];
	}
};

entry l[NMAX];
int p[LMAX][NMAX],v[NMAX],n,k,lg;
char s[NMAX+1];

void suffix_array()
{
	int i,cnt;
	for(i=1;i<=n;i++)
		p[0][i]=s[i]-47;
	for(cnt=1;(1<<(cnt-1))<=n;cnt++) {
		for(i=1;i<=n;i++) {
			l[i].poz=i;
			l[i].nr[0]=p[cnt-1][i];
			if(i+(1<<(cnt-1))<=n)
				l[i].nr[1]=p[cnt-1][i+(1<<(cnt-1))];
			else l[i].nr[1]=-1;
		}
		sort(l+1,l+n+1,cmp());
		p[cnt][l[1].poz]=1;
		for(i=2;i<=n;i++) {
			p[cnt][l[i].poz]=p[cnt][l[i-1].poz];
			if(l[i].nr[0]!=l[i-1].nr[0] || l[i].nr[1]!=l[i-1].nr[1])
				p[cnt][l[i].poz]++;
		}
	}
	lg=cnt-1;
	for(i=1;i<=n;i++) 
		v[p[lg][i]]=i;
}

int LCP(int x, int y)
{
	int i,sol;
	sol=0;
	for(i=lg;i>=0;i--)
		if(p[i][x]==p[i][y]) {
			sol=sol+(1<<i);
			x=x+(1<<i);
			y=y+(1<<i);
			if(x>n || y>n)
				break;
		}
	return sol;
}

int main ()
{
	int i,sol;
	ifstream f("substr.in");
	ofstream g("substr.out");
	f>>n>>k;
	f>>(s+1);
	f.close();
	suffix_array();
	sol=0;
	for(i=1;i<=n-k+1;i++)
		sol=max(sol,LCP(v[i],v[i+k-1]));
	g<<sol;
	g.close();
	return 0;
}