One of the preferred kinds of entertainment of people living in final stages of XX century is filling in the crosswords. Almost every newspaper and magazine has a column dedicated to entertainment but only amateurs have enough after solving one crossword. Real professionals require more than one crossword for a week. And it is so dull — just crosswords and crosswords — while so many other riddles are waiting out there. For those are special, dedicated magazines. There are also quite a few competitions to take part in, even reaching the level of World Championships. Anyway — a lot.
You were taken on by such a professional for whom riddle solving competing is just a job. He had a brilliant idea to use a computer in work not just to play games. Somehow anagrams found themselves first in the line. You are to write a program which searches for anagrams of given words, using a given vocabulary, tediously filled with new words by yours employer.
Input
The first line contains T the number of test cases. There is a blank line after this. Then, T test cases follow — each separated by a blank line. Each test case has the following structure:
< number of words in vocabulary >
< word 1 >
..............
< word N >
< test word 1 >
................
< test word k >
END
< number of words in vocabulary > is an integer number N < 1000. < word 1 > up to < word N > are words from the vocabulary. < test word 1 > up to < test word k > are the words to find anagrams for. All words are lowercase (word ‘END’ means end of data — it is NOT a test word). You can assume all words are not longer than 20 characters.
Output
For each < test word > — in the order in which it appeared — list the found anagrams in the following way:
Anagrams for: < test word >
< No >) < anagram >
...............
< No > should be printed on 3 chars.
In case of failing to find any anagrams your output should look like this:
Anagrams for: < test word >
No anagrams for: < test word >
Print a blank line between datasets.
Sample Input
1
8
atol
lato
microphotographics
rata
rola
tara
tola
pies
tola
kola
aatr
photomicrographics
END
Sample Output
Anagrams for: tola
1) atol
2) lato
3) tola
Anagrams for: kola
No anagrams for: kola
Anagrams for: aatr
1) rata
2) tara
Anagrams for: photomicrographics
1) microphotographics
问题简述:
求一个单词在字典中出现的次数。
问题分析:
可以用字符串排序来解决问题,其他不解释。
程序说明:
程序中用到了字符串排序和字符串转换(小写转换为大写)。
题记:(略)
参考链接:(略)
AC的C++语言程序如下:
/* UVA630 Anagrams (II) */ #include <bits/stdc++.h> using namespace std; int main() { int t, n; scanf("%d", &t); while(t--) { string a, b; map<string, vector<string> > m; scanf("%d", &n); while(n--) { cin >> a; b = a; transform(b.begin(), b.end(), b.begin(), ::toupper); sort(b.begin(), b.end()); m[b].push_back(a); } for(;;) { cin >> a; if(a == "END") break; b = a; transform(b.begin(), b.end(), b.begin(), ::toupper); sort(b.begin(), b.end()); int len = m[b].size(); cout << "Anagrams for: " << a << endl; if(len == 0) cout << "No anagrams for: " << a << endl; else { int num = 0; for(int i = 0; i < len; i++) cout << " " << ++num << ") " << m[b][i] << endl; } } if(t) printf("\n"); } return 0; }