Cod sursa(job #528029)

Utilizator blastoiseZ.Z.Daniel blastoise Data 1 februarie 2011 20:18:37
Problema Substr Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>

using namespace std;

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

char sir[16386];
int i,N,K,pow,ind,maxim,sol;
int aux[16386],cnt[16386];

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

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

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

	pow=2;
	maxim=0;
	sol=0;
	while(pow<=N)
	{
		memset(aux,0,sizeof(aux));
		memset(cnt,0,sizeof(cnt));

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

		for(i=0;i<=N;i++) cnt[aux[i]]++;
		for(i=0;i<=N;i++)
			if(cnt[i]>maxim)
			{
				maxim=cnt[i];
				sol=pow;
			}

		for(i=0;i<=N;i++)
		{
			v[i].first.first=aux[i];
			v[i].second=i;
		}

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

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

	if(maxim>=K) printf("%d\n",sol);
	else printf("0\n");

	return 0;
}