题意:把每个单词全部转化成小写字母,对每个单词,看它的字母重排后得到的单词在所有输入的单词中是否出现过,若没有出现,就输出原单词。所有要输出的单词按字典序排列输出。
这题的模拟没有那么裸,要求挺多的,还是需要思考下的,首先把全部单词都读入并转换成小写并排序,然后把重复的单词去掉,最后把剩下的单词排序并输出原单词。
由于要输出原单词,于是我构造了个结构体,去重就把结构体里面的bool值改掉,然后最后把bool值为真的原单词提取出来排序输出。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;
const int maxn = 1010;
struct Str {
char str[100];
char low[100];
bool no;
} s[maxn];
struct R {
char s[100];
} r[maxn];
bool cmp(R a, R b) {
return strcmp(a.s, b.s) < 0;
}
int main() {
int cnt = 0;
while (scanf("%s", s[cnt].str) && s[cnt].str[0] != '#') {
for (int i = 0; i < strlen(s[cnt].str); i++)
s[cnt].low[i] = tolower(s[cnt].str[i]);
sort(s[cnt].low, s[cnt].low + strlen(s[cnt].str));
s[cnt++].no = true;
}
for (int i = 0; i < cnt; i++)
for (int j = i + 1; j < cnt; j++)
if (0 == strcmp(s[i].low, s[j].low))
s[i].no = false, s[j].no = false;
int n = 0;
for (int i = 0; i < cnt; i++)
if (s[i].no)
strcpy(r[n++].s, s[i].str);
sort (r, r + n, cmp);
for (int i = 0; i < n; i++)
printf("%s\n", r[i].s);
return 0;
}