http://acm.hdu.edu.cn/showproblem.php?pid=4357
题意:
给你两个长度相等的只有小写字母的字符串a,b,问a能不能变成b。变换规则,a[i]与a[j]交换后,字母要+1,即a+1=b,...z+1=a思路:
开始用搜索,果断TLE。
其实是数学规律题:1,字符串长度小于2时特判;
2,长度大于2时, 不妨设任意三个字符为(x1,x2,x3); 变化过程:
变化1
(x1,x2,x3)
(x1,x3+1,x2+1)
(x2+2,x3+1,x1+1)
(x2+2,x1+2,x3+2)
(x1+3,x2+3,x3+2)
(x1+1,x2+1,x3)
变化2
(x1,x2,x3)
(x1+2,x2+2,x3)
(x1+4,x2+2,x3+2)
(x1+2,x2,x3)
即可任选两个字母进行+1操作,前n-1个字母通过变化1总可以变成相同,最后一个字母用变化2。
最终变成了整个串的奇偶性。相同输出YES,不同输出NO
我的代码:
#include<stdio.h>
#include<string.h>
char a[60],b[60],t;
int T,i,j,bl,len,sumA,sumB,js=1;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s%s",a,b);
printf("Case #%d: ",js++);
len=strlen(a);
if(len==2)
{
bl=0;
for(i=0;i<26;i++)
{
t=a[0];
a[0]=a[1]+1;
if(a[0]>'z') a[0]='a';
a[1]=t+1;
if(a[1]>'z') a[1]='a';
if(!strcmp(a,b)){bl=1;break;}
}
if(bl) printf("YES\n");
else printf("NO\n");
}
else
{
sumA=sumB=0;
for(i=0;i<len;i++)
{
sumA+=a[i]-'a';
sumB+=b[i]-'a';
}
if((sumA<sumB)&&(sumB-sumA)%2||(sumA>=sumB)&&(sumA-sumB)%2)
printf("NO\n");
else printf("YES\n");
}
}
return 0;
}