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

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

2017年11月16日 ⁄ 综合 ⁄ 共 1698字 ⁄ 字号 评论关闭

题目分析:

     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;
}

抱歉!评论已关闭.