PKU 1002 487-3279

用普通的方法一个一个地计数然后再按字典排序就超时了.用快速排序之后就是字典顺序,并且可以按顺序算出个数.

#include<iostream> #include<string> #include<stdio.h> using namespace std; int w[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,0,7,8,8,8,9,9,9,0}; int change(string x)//将数据转化为数字 { int sum=0; for(int i=0;x[i]!='/0';i++) { if((x[i]>='0')&&(x[i]<='9')) { sum=sum*10+x[i]-'0'; } else if((x[i]>='A')&&(x[i]<='Z')) { sum=sum*10+w[x[i]-'A']; } } return sum; } int q[100000]; int b[100000]; int c[100000]; int v=1; int comp(const void *lhs, const void *rhs) { return *(int*)lhs - *(int*)rhs; } void main() { string a; int i=0; int m; cin>>m;for(int k=0;k<m;k++){b[k]=0;c[k]=1;} for(int l=0;l<m;l++) { cin>>a; q[l]=change(a); } qsort(q,m,sizeof(int),comp);//将数字进行快排 for(i=0;i<m;) { for(int j=i+1;q[i]==q[j];j++) {;} if(j-i>1){v=0;printf("%.3d-%.4d %d/n",q[i] / 10000,q[i] % 10000, j - i);} i=j; } if(v)cout<<"No duplicates."; }

你可能感兴趣的:(PKU 1002 487-3279)