现在的位置: 首页 > 综合 > 正文

USACO 1.3.3 Calf Flac

2013年10月01日 ⁄ 综合 ⁄ 共 1733字 ⁄ 字号 评论关闭

USACO 
1.3.3  Calf Flac

           题意:给出一个可能是多行的字符串,忽略字符串中出现的除了字母以外的字符,找出最长的回文数,输出这个回文的长度,并且忽略掉这个回文的开头和结束的非法字符,但是回文中间的非法字符要输出,输出这个回文。

          这道题目让我重新理解了EOF的意义,之前做过的题目都是收进一组数据处理一组,看到处理结果之后再收进下一组,但是这道题目在一组数据中就会出现连续接收的情况,所以看不到运行结果。用判题器Debug呵呵,调了好久。

          细节+代码:

         

/*   
ID: 15257142   
LANG: C   
TASK: calfflac  
*/ 

#include<stdio.h>
#include<string.h>
#include<ctype.h>

char a[30000],b[30000],c[30000];
int m,front[30000],behind[30000],x,y,temp,frontpart[30000],behindpart[30000];

int record(int t,int k,int count){
	while(t>=1&&k<=m-1){
		t--;
		k++;
		while(islower(b[t])==0&&t>=1) //翻课本查来的函数,好用。还有头文件。
			t--;
		while(islower(b[k])==0&&k<=m-1)
			k++;
		if(b[t]!=b[k]){
			frontpart[count] = x;
			behindpart[count] = y;
			break;
		}
		if(t==0||k==m){ //最后一组数据的关键。
			frontpart[count] = t;
			behindpart[count] = k;

		}
		x = t;
		y = k;
		temp = temp+2;
	}
	return temp;
}
int main(){
	freopen("calfflac.in", "r", stdin); 
	freopen("calfflac.out", "w", stdout);
	int i,t,k,cmp,length[30000],max,maxnum,g,r,everymax,num1,num2,num3,j;
	while(gets(c)){ //新写法。
		strcat(a,c);
		m = strlen(a)-1;
		a[m+1] = '\n'; //题目要求说换行不能算作那80个字符中的。
	}
	for(i = 0;i<=m;i++){
		if(a[i]>='A'&&a[i]<='Z')
			b[i] = a[i]-'A'+'a';
		else
			b[i] = a[i];
		length[i] = 0;
	}
	for(i = 0;i<=m;i++){
		if(islower(b[i])==0)
			continue;
		g = i-1;
		r = i+1;
		while(g>=1&&islower(b[g])==0)
			g--;
		while(r<=m-1&&islower(b[r])==0)
			r++;
		num1 = num2 = num3 = temp = 0;
		if(b[i]==b[r]){
			temp = 2;
			num1 = record(i,r,1);
		}
		if(b[i]==b[g]){
			temp = 2;
			num2 = record(g,i,2);
		}
		if(b[g]==b[r]){
			temp = 3;
			num3 = record(g,r,3);
		}
		if(num1>num2){
			cmp = 1;
			everymax = num1;
		}
		else{
			cmp = 2;
			everymax = num2;
		}
		if(cmp>num3)
			cmp = cmp;
		else{
			cmp = 3;
			everymax = num3;

		}
		length[i] = everymax;
		front[i] = frontpart[cmp];
		behind[i] = behindpart[cmp];
	}
	max = 0;
	for(i = 0;i<=m;i++){
		if(length[i]>max){
			max = length[i];
			maxnum = i;
		}
	}
	printf("%d\n",max);
	for(i = front[maxnum];i<=behind[maxnum];i++){
		printf("%c",a[i]);
	}
	printf("\n");
	fclose(stdin);  
	fclose(stdout);
	return 0;
}

 

 

抱歉!评论已关闭.