2013年湖南省程序设计大赛 A 近似回文词

这题我们在训练赛中没做出来,事后xxs告诉我一个非常吊的方法:

枚举字符串的中点,当不相等的字母超过2k时,break掉,没超过的时候,更新最大长度

因为字符串长度不是奇数就是偶数,所以我们枚举两种字符串即可

注意: 字符串中非字母不做比较 且 大写字母化为小写字母去比较

 

代码:

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

int ansp,ansl= 0;
char ch[1005];
int hash[1005];

int main()
{
	int k;
	int T= 0;
	while(scanf("%d",&k)!=EOF)
	{
		getchar();
		gets(ch+1);
		int len = strlen(ch+1);
		int flag= 0;
		for(int i= 1; i<= len; i++)
		{
			if(ch[i]>= 'a' && ch[i]<= 'z')
				hash[i]= 1;
			else if(ch[i]>= 'A' && ch[i]<='Z')	
			{
				ch[i]-= 'A'-'a';
				hash[i]= 1;	
			}
			else 
				hash[i]= -1;	
		}
		int ansl= 0;
		for(int i= 1; i<= len; i++)
		{
			int cost= 0;
			int ll= i;
			int rr= i;
			int l;
			while(ll>= 1 && rr<= len)
			{				
				if(hash[ll]== -1)
				{	ll--;	continue;	}
				if(hash[rr]== -1)
				{	rr++;continue; }
				if(ch[ll]!= ch[rr])
					cost+= 2;
				if(cost> 2*k)
					break;
				else 
				{   
					l= rr - ll +1;
					if(l> ansl)
					{
						ansl= l;
						ansp= ll;
					}
				}
				ll--; rr++;
			}
		} //枚举奇字符串 
		for(int i= 1; i<= len; i++)
		{
			int l= 0;
			int cost= 0,pos;
			int ll= i;
			int rr= i+1;
			while(ll>= 1 && rr<= len)
			{
				if(hash[ll]== -1)
				{ll--;continue;	}
				if(hash[rr]== -1)
				{rr++; continue;}
				if(ch[ll]!= ch[rr])
					cost+= 2;
				if(cost> 2*k)
					break;
				else 
				{
					l= rr -ll+1;
					if(l> ansl)
					{
						ansl= l;
						ansp= ll;
					}	
				}
				ll--; rr++;
			}
		}//枚举偶字符串 
		T++;
		printf("Case %d: %d %d\n",T, ansl, ansp);
	}
	return 0;
} 


 

你可能感兴趣的:(字符串处理)