一个模拟题,需要hash和sort一下
这代码在sdutoj上过了在poj上TLE
感觉时间复杂度没有问题,就是排序的nlogn
有一个很坑的地方No duplicates.
最后那个"."必须输出
#include<iostream> #include<cstdio> #include<cmath> #include<vector> #include<algorithm> #include<queue> #include<ctime> #include<cstring> #include<stdlib.h> #include<map> using namespace std; int n,i,flag[9999999],tel[100010],sum,x,p,count_; string t; struct jgt { int bh; string s; int operator <(jgt a)const{ return bh<a.bh;} }dl[100010]; char c; int hash(char c) { int num; num = int(c-'A'); if(c <= 'O') return 2 + num/3; if(c >= 'P'&&c <= 'S') return 7; if(c >= 'T'&&c <= 'V') return 8; return 9; } int main() { scanf("%d",&n); for(i = 1;i <= n;i ++) { int tel_num = 0; sum = 0; t.clear(); while(tel_num != 7) { scanf("%c",&c); if(c == '-'||c == '\n') continue; else { tel_num ++; if(c >= 'A' && c<= 'Z') x = hash(c); else x = c-'0'; t = t+char(x+'0'); sum = sum*10+x; } } flag[sum] ++; if(flag[sum] == 2) { count_ ++; dl[count_].bh = sum; dl[count_].s = t; } } sort(dl+1,dl+count_+1); p = 0; for(i = 1;i <= count_;i ++) { p = 1; int j; for(j = 0;j <= 6;j ++) { printf("%c",dl[i].s[j]); if(j == 2) printf("-"); } printf(" %d\n",flag[dl[i].bh]); } if(!p) printf("No duplicates."); return 0; }