问题链接:CCF NOI1080 统计字符。
时间限制:
1000 ms 空间限制: 262144 KB
题目描述
Johe最近玩起了字符游戏,规则是这样的:读入四行字符串,其中的字母都是大写的,Johe想打印一个柱状图显示每个大写字母的频率。你能帮助他吗?
输入
输入文件共有4行:每行为一串字符,不超过100个字符。
输出
与样例的格式保持严格一致。样例输入
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
样例输出
*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
数据范围限制
提示
问题分析
这个题来自USACO,直接把之前的代码拿来用就可以了。
程序说明 参见参考链接。
要点详解
- 一些程序初看时觉得难,看过了也就不难了。
参考链接:
100分通过的C++程序:
/* POJ2136 Vertical Histogram */ #include <iostream> #include <string> #include <cstring> #include <cctype> using namespace std; const int MAXN = 26; int acount[MAXN]; int main() { int linecount, max; string s; memset(acount, 0, sizeof(acount)); linecount = 0; while (getline(cin, s)) { // 统计字母 for(int i=0; i<(int)s.size(); i++) // if(isalpha(s[i])) // acount[s[i] - 'A']++; if(isupper(s[i])) acount[s[i] - 'A']++; // 每4行输出一次结果 if(++linecount == 4) { linecount = 0; // 计算最大的统计值 max = 0; for(int i=0; i<MAXN; i++) if(acount[i] > max) max = acount[i]; // 输出max行 for(int i=max; i>0; i--) { for(int j=0; j<MAXN; j++) { if(acount[j] >= i) cout << "* "; else cout << " "; } cout << endl; } for(int i=0; i<MAXN; i++) cout << (char)('A' + i) << " "; cout << endl; } } return 0; }