洛谷P2037 电话号码
题目描述
一串由长长的数字组成的电话号码通常很难记忆。为了方便记忆,有种方法是用单词来方便记忆。例如用“Three Tens”来记忆电话3-10-10-10。
电话号码的标准形式是七位数字,中间用连字号分成前三个和后四个数字(例如:888-1200)。电话号码可以用字母来表示。以下是字母与数字的对应:
A,B和C对应2
D,E和F对应3
G,H和I对应4
J,K和L对应5
M,N和O对应6
P,R和S对应7
T,U和V对应8
W,X和Y对应9
你会发现其中没有字母Q和Z。电话中的连字号是可以忽略。例如TUT-GLOP的标准形式是888-4567,310-GINO的标准形式是310-4466,3-10-10-10的标准形式是310-1010。
如果两个电话号码的标准形式是一样的,那么这两个电话号码就是一样的。
现在有一本电话簿,请从中找出哪些电话号码是重复的。
输入输出格式
输入格式:
第一行一个正整数N,表示有多少个电话号码。
以下N行,每行一个电话号码,电话号码由数字、大写字母(除Q、Z)和连字符组成。电话号码长度不会超过1000。所有电话号码都合法。
输出格式:
将所有重复的电话号码按字典序以标准形式输出,并且在每个电话号码后跟一个整数,表示该电话号码共出现了多少次,电话号码和整数间用一个空格隔开。不要输出多余空行。
如果没有重复的电话号码,则输出:No duplicates.
输入输出样例
输入样例#1:
3 TUT-GLOP 3-10-10-10 310-1010
输出样例#1:
310-1010 2
说明
【数据范围】
对于30%的数据,N<=20。
对于50%的数据,N<=10000。
对于100%的数据,N<=100000。
#include<iostream> #include<cstdio> #include<cstring> #define mod 1000003 using namespace std; int t[1000004],n; long long map[1000005]; char s[1001]; void Hash(char ch[],int len){ long long res=1,now=0; for(int i=1;i<=len;i++){ if(ch[i]<='9'&&ch[i]>='0')res=(res*10+ch[i]-'0')%mod,now=now*10+ch[i]-'0'; else{ if(ch[i]<='C'&&ch[i]>='A')res=(res*10+2)%mod,now=now*10+2; if(ch[i]<='D'&&ch[i]>='F')res=(res*10+3)%mod,now=now*10+3; if(ch[i]<='G'&&ch[i]>='I')res=(res*10+4)%mod,now=now*10+4; if(ch[i]<='J'&&ch[i]>='L')res=(res*10+5)%mod,now=now*10+5; if(ch[i]<='M'&&ch[i]>='O')res=(res*10+6)%mod,now=now*10+6; if(ch[i]=='P'||ch[i]=='R'||ch[i]=='S')res=(res*10+7)%mod,now=now*10+7; if(ch[i]<='T'&&ch[i]>='V')res=(res*10+8)%mod,now=now*10+8; if(ch[i]<='W'&&ch[i]>='Y')res=(res*10+9)%mod,now=now*10+9; } } if(!t[res])map[res]=now; t[res]++; } void Print(int x){ printf("%d-",map[x]/10000); printf("%d",map[x]%10000); } int main(){ freopen("Cola.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s+1); int len=strlen(s+1); Hash(s,len); } for(int i=1;i<=1000003;i++){ if(t[i]>1){ Print(i); printf(" %d\n",t[i]); } } return 0; }
/* 以后不要逞强用hash了!就选stl map<string,int> */ #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int n,map[27]={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}; string s[100010],c; int main(){ freopen("Cola.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++){ cin>>c; int len=c.length(); for(int j=0;j<c.length();j++){ if(c[j]=='-')continue; if(c[j]<='9'&&c[j]>='0')s[i]+=c[j]; else s[i]+=map[c[j]-'A']+'0'; } } int t=1; bool flag=0; sort(s+1,s+n+1); for(int i=1;i<=n+1;i++){ if(s[i]!=s[i-1]){ if(t>1)flag=1,cout<<s[i-1].substr(0,3)<<'-'<<s[i-1].substr(3,4)<<' '<<t<<endl; t=1; } else t++; } if(!flag)printf("No duplicates."); return 0; }