hautoj 1268 小天使改名
1268: 小天使改名
时间限制: 2 秒 内存限制: 128 MB提交: 437 解决: 123
提交 状态
题目描述
小天使的b站帐号被大家发现啦。于是小天使决定改名,将他原有ID中的两个不同位置的字母进行交换。(小天使有可能将两个不同位置的相同字母进行交换,虽然这样做他的ID并没有发生变化)
Lsf知道小天使原来的ID,他想知道某个ID是否可能是小天使的新ID。
输入
第一行为数据组数T(T≤100)。
每组数据的第一行是字符串s1,(2≤length(s1)≤1000),为小天使的原始ID。
第二行是字符串s2,(length(s2)=length(s1)),为Lsf猜测的ID。
s1,s2均只含小写字母。
输出
对每组数据输出一行,如果这个ID可能是小天使的新ID,输出YES,否则输出NO。
样例输入
3 ch hc aa aa abc abb
样例输出
YES YES NO
说来惭愧,第一次组队参加线下比赛,卡在这题上,怎么都找不到错误,导致一个队伍三个人心态爆炸。
后来才发现一个坑,就是没有交换,没有相同字符的时候,前后相等的输出是no。
如样例:
输入:
ch
ch
输出:
NO
1 #include<cstdio> 2 #include<cstring> 3 #define Max 1111 4 char s1[Max],s2[Max]; 5 int main() 6 { 7 int t; 8 scanf("%d",&t); 9 while(t--) 10 { 11 int ascii[222]={0}; 12 int flag=0,f=0; 13 int u,v; 14 scanf("%s %s",s1,s2); 15 int len=strlen(s1); 16 for(int i=0;i<len;i++) //判断字符串内有没有相同的字符,如果有,则f++,否则 f=0 17 { 18 int x=s1[i]; 19 ascii[x]++; 20 if(ascii[x]>1) 21 { 22 f++; 23 break; 24 } 25 } 26 for(int i=0;i<len;i++) //找出两个不同处 27 { 28 if(flag==1&&s1[i]!=s2[i]) 29 { 30 v=i; 31 break; 32 } 33 if(s1[i]!=s2[i]) 34 { 35 u=i; 36 flag=1; 37 } 38 } 39 if(flag==1) //如果存在两处不同,则将其位置置换。 40 { 41 int temp=s1[v]; 42 s1[v]=s1[u]; 43 s1[u]=temp; 44 } 45 if(!strcmp(s1,s2)) 46 { 47 if(flag==0&&f==0) //若两字符串相等且未置换且单个字符串内无重复字符,则不会是改后的名字 48 printf("NO\n"); 49 else 50 printf("YES\n"); 51 } 52 else 53 printf("NO\n"); 54 } 55 return 0; 56 }