XTU OJ 1292

题意

输入一个字符串,定义一个条件,长度是偶数的子串,并且这个子串的前半部分和后半部分完全相同,求满足条件的子串的最长长度,字符串的最长长度不会超过1000,保证全是小写英文字母

输入

2
abbab
aaaabbbbbb

输出

2
6

代码

#include
#include//strlen 函数头文件
#include//bool变量头文件

int main()
{
	int t;
	scanf("%d",&t);
	
	while(t--)
	{
		char s[1010];
		scanf("%s",s);
		
		int len=strlen(s);
		bool flag=false;
		int i=0,j=0,k=0;
		
		for(i=len/2;i>0;i--)//题目要求的是最长的子串
			//子串的长度要求是2n,满足要求的子串的前半部分和后半部分相等
		{//i枚举的是答案的一半,并且是从大往小进行枚举的(求最大值,找到符合条件的直接结束循环)
			for(j=0;j+2*i<=len;j++)
			{//j枚举的是满足条件的子串的起点,从满足条件的子串的第一个元素开始
				flag=true;//假设子串是满足条件的
				for(k=j;k<i+j;k++)
				{//k枚举的是满足条件的子串的前半部分
					if(s[k]!=s[k+i])//i表示的是满足条件子串的长度的一半
						//也就是子串前半部分的长度
					{
						flag=false;
						break;
					}
				}
				
				if(flag==true)	break;//因为是答案i从最大值开始枚举的,所以找到了一个满足条件的子串
				//跳出循环即可
			}
			
			if(flag==true)	break;
			//因为是答案i从最大值开始枚举的,所以找到了一个满足条件的子串
			//跳出循环即可
		}
		
		if(flag==true)	printf("%d\n",i*2);
		else	printf("0\n");
	}
	
	return 0;
}

总结

1.题目要求要看仔细

我最开始以为是求拥有最长相等元素的子串长度,根据样例瞎猜的题意,满足两个样例,还以为是哪里超时了之类的,结果是WA,蒙了很久

2.求最大值

我们就思考可能的最大的最大值是多少,最大的最大值是整个字符串长度(假设字符串长度是偶数的话),把一个子串分成两个部分,前半部分等于后半部分,直接把字符串长度除以2 ,系统自动向下取整,答案是除以二再乘以2

3.然后就需要遍历每一个字符串元素

准确的来说是寻找符合条件的子串,我们需要从第一个元素开始遍历,每一个元素都可以作为子串的起点,但是可以做一个优化,就是起点加上答案的值小于字符串的总长度

4.条件判断

根据3说的起点,判断子串前半部分的元素是否完全等于后半部分,如果有一对元素不相等,就结束循环,表示不满足条件,一旦找到符合条件的子串,该字串的长度就是我们要求的答案,就像前面说的,从最大值开始寻找,找到的第一个答案,就是我们要求的答案

你可能感兴趣的:(湘大,XTU,OJ,算法,数据结构)