这是poj上某大神发的,精辟简洁,转来膜拜之。#include <cstdio> #include <algorithm> using namespace std; char s[31]; int Hash() { int sum=0; for(int i=0,k=0;k<7;i++) { if(s[i]>='0'&&s[i]<='9') { sum*=10;k++; sum+=(s[i]-'0'); } else if(s[i]>='A'&&s[i]<'Z') { sum*=10;k++; sum+=((s[i]-'A'-(s[i]>'Q'))/3+2); } } return sum; } int main() { int n;scanf("%d",&n); int data[n];getchar(); for(int tmp=0;tmp<n;tmp++) { gets(s); data[tmp]=Hash(); } sort(data,data+n); bool p=false;n--; for(int i=0,num=1;i<n;i+=num=1) { while(data[i]==data[i+1]) { num++; i++; } if(num>1) { printf("%03d-%04d %d\n",data[i]/10000,data[i]%10000,num); p=true; } } if(!p)printf("No duplicates.\n"); return 0; }
参考别人的写法,不容易超时
#include <iostream> #include <cstdio> #include <cstring> #include <set> #include <map> using namespace std; int num[] = { 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 0, 7, 7, 8, 8, 8, 9, 9, 9 }; map<int, int> s; char buf[128]; int main() { int t; scanf("%d", &t); bool flag = false; for(int i = 0; i < t; i++) { scanf("%s", &buf); int c = 0; for(int j = 0; buf[j]; j++) { if(isdigit(buf[j])) c = c * 10 + buf[j] - '0'; else if(isalpha(buf[j])) c = c * 10 + num[ buf[j] - 'A' ]; } s[c]++; } for(map<int, int>::iterator it = s.begin(); it != s.end(); it++) if(it->second > 1) { flag = true; printf("%03d-%04d %d\n", it->first / 10000, it->first % 10000, it->second); } if(!flag) puts("No duplicates."); return 0; }
07-13
07-13
07-13
07-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交