题目描述
继MIUI8推出手机分身功能之后,MIUI9计划推出一个电话号码分身的功能:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替 ("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"), 然后随机打乱这些字母,所生成的字符串即为电话号码对应的分身。
输入描述:
第一行是一个整数T(1 ≤ T ≤ 100)表示测试样例数;接下来T行,每行给定一个分身后的电话号码的分身(长度在3到10000之间)。
输出描述:
输出T行,分别对应输入中每行字符串对应的分身前的最小电话号码(允许前导0)。
示例1
输入
4 EIGHT ZEROTWOONE OHWETENRTEO OHEWTIEGTHENRTEO
输出
0 234 3450345
![]()
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<map> using namespace std; map<char,int>m;//每个字母出现次数 map<int,int>m2;//每个数字出现次数 int a[15];//记录出现过的数,还原之后的数 int main(){ int t; string s; scanf("%d",&t); char c[14]={'E','F','G','H','I','N','O','S','Z','W','T','X','V','R'};//所有可能出现的字母 while(t--){ for(int i=0;i<14;i++) m[c[i]]=0;//初始化 cin>>s; for(int i=0;i<s.length();i++) ++m[s[i]]; memset(a,0,sizeof(a)); int count=0; for(int i=0;i<=9;i++) m2[i]=0; m2[0]=m['Z']; m2[2]=m['W']; m2[6]=m['X']; m2[8]=m['G']; m2[3]=m['H']-m2[8]; m2[7]=m['S']-m2[6]; m2[5]=m['V']-m2[7]; m2[4]=m['F']-m2[5]; m2[1]=m['O']-m2[0]-m2[2]-m2[4]; m2[9]=m['I']-m2[5]-m2[6]-m2[8]; for(int i=0;i<=9;i++){ if(m2[i]>0){ ++count; a[count]=i; if(i==8) a[count]=0; else if(i==9) a[count]=1; else a[count]=i+10-8; } else continue; } sort(a+1,a+count+1); int sum; for(int i=1;i<=count;i++){ if(a[i]==0)//注意还原成原来给的数 sum=8; else if(a[i]==1) sum=9; else sum=a[i]+8-10; for(int j=1;j<=m2[sum];j++)//出现多少次就输出多少次 printf("%d",a[i]); } printf("\n"); } return 0; }