Cod sursa(job #1153)

Utilizator DorinOltean Dorin Dorin Data 12 decembrie 2006 19:32:26
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
# include <fstream>
# include <string>

using namespace std;

# define input "substr.in"
# define output "substr.out"

# define max 16390

char b[max][max],s[max],aux[max];

int compara(char *p,char *q);

long n,i,j,k,nr,rez,r,m;

long divide(long p,long q)
{
     long st=p,dr=q;
     char x[max];
     strcpy(x,b[st]);
     while(st < dr)
     {
              while(st < dr && strcmp(b[dr],x)>=0) dr--;
              strcpy(b[st],b[dr]);
              while(st < dr && strcmp(b[st],x)<=0) st++;
              strcpy(b[dr],b[st]);
     }
     strcpy(b[st],x);
     return st;
}

void quick(long p,long q)
{
     m = divide(p,q);
     if(m-1 > p) quick(p,m-1);
     if(m + 1 < q) quick(m+1,q);
}

int main()
{
	ifstream fin ( input ) ;
	ofstream fout ( output ) ;

	fin >> n >> r;
	fin.get();

	fin.getline(s,max);

	for(i = n-r+1;i;i--)
	{
		for(k = 0;k<=n-i;k++)
		{
			for(j = 0;j<i;j++)
				b[k][j] = s[j+k];
			b[k][j] = '\0';
		}
		quick(0,n-i);
/*		for(k = 0;k<n-i;k++)
			for(j = k+1;j<=n-i;j++)
				if(compara(b[k],b[j]))
				{
					strcpy(aux,b[k]);
					strcpy(b[k],b[j]);
					strcpy(b[j],aux);
				}*/
		nr= 1;
		for(k = 0;k<n-i-1;k++)
		{
			if(!strcmp(b[k],b[k+1]))
			{
				nr++;
			}
			else
			{
				if(nr > rez)
					rez = nr;
				nr = 1;
			}
		}
		if(rez >= r)
		{
			fout << i;
			return 0;
		}
	}

	return 0;
}
int compara(char *p,char *q)
{
 int 	n = strlen(p);
 int 	m = strlen(q);
	if(n > m)
		return 1;
	if(n < m)
		return 0;
	for(int i = 0;i<n;i++)
	{
		if(p[i] > q[i])
			return 1;
		if(p[i] < q[i])
			return 0;
	}
	return 0;
}