Cod sursa(job #30633)

Utilizator varuvasiTofan Vasile varuvasi Data 14 martie 2007 19:37:35
Problema Substr Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#include <string>
#include <algorithm>

#define MaxN 17000

using namespace std;

int N, K;
char s[MaxN];
int maxlen;
char *ps[MaxN];

void Sort(int st, int dr)
{
    char *pivot = ps[(st+dr)/2];
	int i = st, j = dr;
	do
  	{
		while ( strcmp(ps[i], pivot) < 0  ) i++;
		while ( strcmp(ps[j], pivot) > 0 ) j--;
		if ( i <= j )
		{
			char *aux = ps[i];
			ps[i] = ps[j];
			ps[j] = aux;
			i++; j--;
		}

	} while ( i <= j );

	if ( st < j ) Sort(st, j);
	if ( i < dr ) Sort(i, dr);
}

int pref(char *a, char *b)
{
    int L = 0;
    for (; *a && (*a++ == *b++); L++);
    return L;
}
    
bool cmp(string a, string b)
{
    if (a < b) return 1;
    return 0;
}
    
int main()
{
    int i, j;
    
    FILE *fin = fopen("substr.in", "rt");
    FILE *fout = fopen("substr.out", "wt");
    
    fscanf(fin, "%d %d\n%s", &N, &K, &s);
    
    for (i = 0; i < N; i++)
        ps[i] = &s[i];
    
    sort(ps, ps + N, cmp);
    //Sort(0, N-1);
    
    for (i = 0; i <= N - K; i++)
    {
        int x = pref(ps[i], ps[i+K-1]);
        if (x > maxlen) maxlen = x;
    }
        
    //for (i = 0; i < N; i++)
    //    fprintf(fout, "%s\n", ps[i]);
    fprintf(fout, "%d\n", maxlen);
    
    fclose(fin);
    fclose(fout);
    
    return 0;
}