题目描述
大战即将来临,杰洛特需要为自己声张声势,但是喊得太假有会被人识破
因此杰洛特决定连着喊出两句话,两句话中所有的字母数量全部相等则不会被识破
请指出杰洛特所喊的话是否会被识破
输入
一个t表示几组数据
接下来t组,每组第一行一句话,第二行一句话
每句话长度小于100000
输出
如果杰洛特没有被识破则输出"Yes"
如果被识破了则喊出"No"
样例输入
2
wj nb
w jnb
Iiread
readii
样例输出
Yes
No
原题链接:问题 2110: 虚张声势
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100000
int cmp(char *s, char *t){return *s - *t;} // 比较函数
// 去掉t中的空白字符,升序排序后存入s
static inline void trip_sort(char *s, char *t){
char *p, *delim = "\x20\t"; // 空白字符
p = strtok(t, delim);
*s = 0;
do{ strcat(s, p); }while((p = strtok(NULL, delim)));
qsort(s, strlen(s), 1, (void*)cmp);
}
// 当 cs 和 ct 中字符和每个字符的个数都一样时,返回 true,否则返返回false。
char* equal(char *cs, char * ct){
static char b1[N], b2[N];
trip_sort(b1, cs);
trip_sort(b2, ct);
return strcmp(b1, b2) ? "No":"Yes";
}
char buf1[N], buf2[N];
int main(void)
{ // 策略是:把两句话去掉空白字符,升序排序字符,比较字符串是否相等;
scanf("%*d\n"); // 丢弃数字行
// 一次读入两行,直到EOF
while (gets(buf1) && gets(buf2)) puts(equal(buf1, buf2));
return 0;
}
PS:分别计算各个字母出现的次数,然后比较,这样可以通过全部测试用例。但我也想弄清楚上面的代码问题出在哪里?