chenxizhan1995
chenxizhan1995
2019-11-21 23:47

在线编程习题“2110: 虚张声势”总是不能拿满分,找不到问题出在哪了?

5
  • c语言
题目描述
大战即将来临,杰洛特需要为自己声张声势,但是喊得太假有会被人识破
    因此杰洛特决定连着喊出两句话,两句话中所有的字母数量全部相等则不会被识破
    请指出杰洛特所喊的话是否会被识破

输入
一个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:分别计算各个字母出现的次数,然后比较,这样可以通过全部测试用例。但我也想弄清楚上面的代码问题出在哪里?

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

1条回答