P1808 单词分类
题目描述
Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类。
两个单词可以分为一类当且仅当组成这两个单词的各个字母的数量均相等。
例如“AABAC”,它和“CBAAA”就可以归为一类,而和“AAABB”就不是一类。
现在Oliver有N个单词,所有单词均由大写字母组成,每个单词的长度不超过100。你要告诉Oliver这些单词会被分成几类。
输入格式
输入文件的第一行为单词个数N,以下N行每行为一个单词。
输出格式
输出文件仅包含一个数,表示这N个单词分成的类数
输入输出样例
输入
3
AABAC
CBAAA
AAABB
输出
2
说明/提示
对于70%的数据满足N≤100。 对于100%的数据满足N≤10000。
题解
用sort函数排序没一个单词,统一标准;
塞入集合,自动判重并去重。
#include <bits/stdc++.h>
using namespace std;
set<string>st;
string str;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> str;
sort(str.begin(), str.end());
st.insert(str);
}
cout << st.size() << endl;
return 0;
}
后记
这道题其实我感觉似曾相识,那道题是【UVA156 反片语 Ananagrams】,只不过那一道题是用的map和动态数组将字符串来回处理,比这个要难得多。不过重点的核心思路是相同的——用sort重排字符串使其统一标准