UVa 156 - Ananagrams

/* coder: ACboy date: 2010-2-27 result: AC description: UVa 156 - Ananagrams */ #include <iostream> #include <string> #include <sstream> #include <algorithm> #include <vector> using namespace std; // 每个单词结构体 struct word { // 原字符串 string orinigal; // 变成小写并排序过后的字符串 string besort; }; // 用来存储字典用的 vector<word> ve(1010); // 用来保存结果用的 vector<string> result; // 把字母变小写 void fun(char &a) { a = tolower(a); } // 两个单词之间如何比较大小 int cmp(word a, word b) { int alen, blen; alen = a.orinigal.size(); blen = b.orinigal.size(); if (alen != blen) return alen < blen; else return a.besort < b.besort; } int main() { string input; #ifndef ONLINE_JUDGE freopen("156.txt", "r", stdin); #endif int c = 0; while (getline(cin, input)) { if (input == "#") break; else { // 字符串文件流 istringstream in(input); // 只要没有到文件流末,就一直做 while (!in.eof()) { string str; in >> str; // 保存原字符串 ve[c].orinigal = str; string t = str; // 字母变小写 for_each(t.begin(), t.end(), fun); // 单词内部排序 sort(t.begin(), t.end()); // 保存处理完后的的字符串(处理过程:全部字母变小写,然后进行内部排序) ve[c].besort = t; c++; } } } // 根据besort字段对字典中的单词进行排序 sort(ve.begin(), ve.begin() + c, cmp); string current = ve[0].besort; int pos = 0; // 标记单词出现的次数 int flag = 1; for (int j = 1; j < c; j++) { if (ve[j].besort == current) { flag++; } else { if (flag == 1) result.push_back(ve[pos].orinigal); flag = 1; current = ve[j].besort; pos = j; } } if (flag == 1) { result.push_back(ve[pos].orinigal); } sort(result.begin(), result.end()); int len = result.size(); for (int k = 0; k < len; k++) { cout << result[k] << endl; } return 0; }

你可能感兴趣的:(c,struct,String,input,each,fun)