Cod sursa(job #528486)

Utilizator blastoiseZ.Z.Daniel blastoise Data 2 februarie 2011 21:59:03
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>

using namespace std;

vector <pair<pair<int,int>,int> > v;

int N,K,i,j,k,pow,ind,sol,nr;
char sir[16388];
int aux[16388];

int main()
{
	freopen("substr.in","r",stdin);
	freopen("substr.out","w",stdout);

	scanf("%d %d\n",&N,&K);
	fgets(sir,N+3,stdin);
	N--;

	for(i=0;i<=N;i++)
		v.push_back(make_pair(make_pair((int)sir[i],0),i));

	sort(v.begin(),v.end());

	pow=1;
	while(pow<=N)
	{
		memset(aux,0,sizeof(aux));
		ind=0;
		aux[v[0].second]=0;
		for(i=1;i<=N;i++)
		{
			if(v[i].first.first!=v[i-1].first.first) ind++;
			else
			if(v[i].first.second!=v[i-1].first.second) ind++;
			aux[v[i].second]=ind;
		}

		for(i=0;i<=N;i++)
		{
			v[i].second=i;
			v[i].first.first=aux[i];
			if(i+pow<=N) v[i].first.second=aux[i+pow];
			else v[i].first.second=-1;
		}

		sort(v.begin(),v.end());
		pow*=2;
	}

	sol=0;
	for(i=0;i<=N-K+1;i++)
	{
		nr=0;
		j=v[i].second;
		k=v[i+K-1].second;
		while(j<=N&&k<=N&&sir[j]==sir[k]) j++,k++,nr++;
		if(nr>sol) sol=nr;
	}

	printf("%d\n",sol);

	return 0;
}