做这题的时候没上网看, 看了题目第一反应就是用map容器来做,
遗憾的是, 我完全不懂map容器, 看了一下书的介绍, 知道了一点点就开始试验一下,
开始做运行答案也正确(至少我自己的试验过的数据都能按要求输出),
可惜的是, 提交后狂TLE, 一开始是1050ms, 我就改改 谁知道悲剧事情又来了, 改了以后1200, 更是无语了。
后来看了网上那些人的代码, 找到几个是用c做的, 我打算坚持自己的map容器方法来做, 毕竟这样少了排序阶段。
发现有人说 sprintf 比 cin输出大概快100ms, 然后改了, 改了就过了 。
虽然不是最精炼的代码, 用时620ms, 我没怎么改了, 所以这个就是个比较烂的代码。
留着到时看到比较好的代码回来再改。
如果有人回我博客提出它宝贵的意见, 我感激不尽啊!
一下是我的代码:
#include <iostream> #include <fstream> #include <map> #include <string> #include <cstdio> using namespace std; void del(string &s) { char c[9]; int i, j; int table[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9}; for(i=0, j=0; i<s.size(); i++) { if(s[i]!='-') { if(s[i]>='A' && s[i]<='Z') c[j++] = table[s[i]-'A']+'0'; else c[j++] = s[i]; } } c[j]='\0'; s = c; s.insert(3, 1, '-'); } int main() { //ifstream in("OpenJudgeText.txt"); int N, i, flat=0; char c[100001]; string s; map<string, int> list; map<string, int>::iterator it; scanf("%d", &N); while(N--) { scanf("%s", c); s = c; del(s); list[s]++; if(list[s] > 1) flat=1; } if(flat == 0) printf("No duplicates.\n"); else { for(it=list.begin(); it!=list.end(); it++) { if(it->second > 1) { cout<<it->first; printf(" %d\n", it->second); } } } //cin>>i; return 0; }