USACO 1.3.4 Calf Flac(最大回文子串)

题目分析:

     1.直接枚举回文串的起始位置和重点位置会超时,O(n^3),会超时,最长的回文串为2000;

     2. 直接枚举中间位置,O(n^2),

     3.先对字符文本进行预处理,对非字母符号全部去掉,s1[20100],开一个p[20100]记录s1[i]在原字符串中的位置,

方便输出原字符串.

    4.注意它的输入,是以文本的形式输入,可能有好几行,

    5.FILE *fin=fopen("calfflac.in","r");
FILE *fout=fopen("calfflac.out","w");
int k=0;
while(!feof(fin))
{
s[k++]=fgetc(fin);
}

       fprintf(fout,"%d\n",ans);
for(int i=p[start];i<=p[end];i++)
fprintf(fout,"%c",s[i]);
fprintf(fout,"\n");

的用法



/*
ID:wconvey
PROG:calfflac
LANG:C++
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctype.h>
#include<algorithm>
using namespace std;
char s[20100],s1[20100];
int p[20100];
int main()
{
	//freopen("calfflac.in","r",stdin);
	//freopen("calfflac.out","w",stdout);
	FILE *fin=fopen("calfflac.in","r");
	FILE *fout=fopen("calfflac.out","w");
	int k=0;
	while(!feof(fin))
	{
		s[k++]=fgetc(fin);
	}
	s[k]='\0';
	//gets(s);
	{
		int len=strlen(s);
		int c=0;
		for(int i=0;i<len;i++)
		{
			if(isalpha(s[i]))
			{
				p[c]=i;
				s1[c++]=toupper(s[i]);
			}
		}
		c--;
		//printf("%d****\n",c);
		//puts(s);
		//puts(s1);
		/*for(int i=0;i<=c;i++)
			printf("p[%d]=%d  %c    ",i,p[i],s[p[i]]);
		printf("*****\n");*/
		int ans=0,start=0,end=0;
		for(int i=1;i<=c-1;i++)
		{
			int temp=0,j;

			if(s1[i]==s1[i+1])
			{
				temp+=2;
				for(j=1;j<=i;j++)
				{

					if(i+j<=c && s1[i-j]==s1[i+1+j])
						temp+=2;
					else
						break;
				}
				if(temp>ans)
				{
					ans=temp;
					start=i-(j-1);
					end=i+(j-1)+1;
					//printf("temp=%d    start=%d   end=%d\n",temp,start,end);
				}
			}
			else
			{
				temp+=1;
				for(j=1;j<=i;j++)
				{
					if(i+j<=c&&s1[i-j]==s1[i+j] )//写错了,s1[i-j]==s1[i-j]
						temp+=2;
					else
						break;
				}
			    if(temp>ans)
				{
					ans=temp;
					start=i-(j-1);
					end=i+(j-1);
					//printf("temp=%d    start=%d   end=%d\n",temp,start,end);
				}
			}
			
		}//******for
		/*printf("%d\n",ans);
		
		for(int i=p[start];i<=p[end];i++)
			printf("%c",s[i]);
		printf("\n");*/
		fprintf(fout,"%d\n",ans);
		for(int i=p[start];i<=p[end];i++)
			fprintf(fout,"%c",s[i]);
		fprintf(fout,"\n");
	}
	//system("pasue");
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值