Cod sursa(job #651131)

Utilizator dobreDobre Catalin Andrei dobre Data 19 decembrie 2011 21:37:17
Problema PalM Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>
#include <string.h>
#define MAX 501
const char* file_in = "palm.in";
const char* file_out = "palm.out";
char s[MAX];
int lft[MAX];
int right[MAX];
int N;

int min(int a,int b){
	return  a < b?a:b;
}
void readInput(){
	FILE *f = fopen(file_in,"r");
	fgets(s,MAX,f);
	N = strlen(s) - 1;
	printf("%d %s\n",N,s);
}
void preproces(){
	lft[0] = 1; right[N -1] = 1;
	for (int i = 1 ; i < N; i++)
		if (s[i - 1] <= s[i]) lft[i] = lft[i - 1] + 1;
		else lft[i] = 1;
	for (int i = N - 1 ; i >= 0; i--)
		if (s[i] >= s[i + 1]) right[i] = right[i + 1] + 1;
		else right[i] = 1;

}
void solve(){
		int k,count,max = 1;
		for (int i = 0 ; i < N; i++){
				int ii,jj;
				ii = jj = i;
				k = min(lft[i],right[i]);
				count = 0;
				while (ii >= 0 && jj < N && k >0){
						if(s[ii] == s[jj]) count++;
						else break;
						k--;
						ii--;
						jj++;
				}
				if (max < count * 2 - 1) max = count * 2 - 1;
		}
		for (int i = 0 ; i < N - 1; i++){
				int ii,jj;
				ii = i;
				jj = i + 1;
				k = min(lft[i],right[i + 1]);
				count = 0;
				while (ii >= 0 && jj < N && k >0){
						if(s[ii] == s[jj]) count++;
						else break;
						k--;
						ii--;
						jj++;
				}
				if (max < count * 2) max = count * 2;
		}
		FILE * f = fopen(file_out,"w");
		fprintf(f,"%d",max);
		//printf("Sol %d\n",max);
		fclose(f);
}
void print_vec(int v[MAX], int size){
		for (int i = 0 ; i < N; i++)
			printf("%d ", v[i]);
		printf("\n");
}
int main(){
	printf("input file! %s\n",file_in);
	readInput();
	preproces();
	solve();
	print_vec(lft,N);
	print_vec(right,N);
	return 0;
}