现在开始刷poj的题,但是这题是有一次学校的contest上考过的,但是那次由于超时的问题,就没有A掉,这次刚敲完,还是受到了上次的影响还是超时,这时候实在想不明白就应该看discuss了,北大的discuss还是灰常给力,起码比起自己的Oj给力多了,自己oj基本没人讨论。。。后来发现自己用的优先队列是问题关键所在,对于这么大的一个储存数组,超时是难免的。后来还是得用纯数组来储存,节省比较时间。
第一个代码是TLE的错误代码,也就是我纠结很久的代码:
#include<cstdio> #include<string> #include<map> #include<iostream> #include<queue> using namespace std; struct node { string num; int re; friend bool operator <(node a,node b) { return a.num>b.num; } }qe[100005]; int main(void) { int n; map<char,char> ma; char a[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y'}; char b[]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','7','7','8','8','8','9','9','9'}; for(int i=0;i<24;i++) ma.insert(make_pair(a[i],b[i])); cin>>n; priority_queue<node> qq; int len=0; for(int i=0;i<n;i++) { string s; cin>>s; int x=0; string y; y="00000000"; y[3]='-'; for(int e=0;s[e]!='\0';e++) { if(s[e]=='-') continue; else if(s[e]>='A'&&s[e]<='Z') { y[x++]=ma[s[e]]; } else { y[x++]=s[e]; } if(x==3) x++; } int flag=0; for(int j=0;j<len;j++) { if(qe[j].num==y) { qe[j].re++; flag=1; break; } } if(!flag) { qe[len].num=y; qe[len++].re=1; } } for(int i=0;i<len;i++) { if(qe[i].re>=2) { qq.push(qe[i]); } } while(!qq.empty()) { node xx=qq.top(); qq.pop(); cout<<xx.num<<' '<<xx.re<<endl; } }
下面是看北大discuss大牛的回答后,改写的:
AC代码:
#include<cstdio> #include<cstring> #include<string> #include<map> #include<iostream> using namespace std; int ar[10000000]; int main(void) { int n; map<char,char> ma; char a[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y'}; char b[]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','7','7','8','8','8','9','9','9'}; for(int i=0;i<24;i++) ma.insert(make_pair(a[i],b[i])); cin>>n; memset(ar,0,sizeof(ar)); int Min=100000000; int Max=-1; for(int i=0;i<n;i++) { string s; cin>>s; int x=0; int sum=0; for(int e=0;s[e]!='\0';e++) { if(s[e]=='-') continue; else if(s[e]>='A'&&s[e]<='Z') { sum=sum*10+ma[s[e]]-'0'; } else if(s[e]>='0'&&s[e]<='9') { sum=sum*10+s[e]-'0'; } } ar[sum]++; int flag=0; if(sum>Max) Max=sum; if(sum<Min) Min=sum; } int flag=0; for(int i=Min;i<=Max;i++) { if(ar[i]>=2) { printf("%03d-%04d %d\n",i/10000,i%10000,ar[i]); flag=1; } } if(!flag) printf("No duplicates.\n"); }