做这道题的历程:WA—TLE—WA—AC
本来是道水题。。但是卡在了各种点上。。心情复杂.jpg
一开始没有注意到"No duplicates."的情况,WA了两发。。。改了后发现TLE了。。用字符串处理的,先附上TLE的代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
map<string,int>mp;
set<string>st;//排序
map<char,char>dic;
void init()
{
dic['A']=dic['B']=dic['C']='2';
dic['D']=dic['E']=dic['F']='3';
dic['G']=dic['H']=dic['I']='4';
dic['J']=dic['K']=dic['L']='5';
dic['M']=dic['N']=dic['O']='6';
dic['P']=dic['R']=dic['S']='7';
dic['T']=dic['U']=dic['V']='8';
dic['W']=dic['X']=dic['Y']='9';
dic['0']='0';dic['1']='1';dic['2']='2';
dic['3']='3';dic['4']='4';dic['5']='5';
dic['6']='6';dic['7']='7';dic['8']='8';dic['9']='9';
}
int main()
{
int n;
init();
scanf("%d",&n);
//memset(s,'\0',sizeof(s));
mp.clear();st.clear();
char s[15];
char t[5000];
for(int i=0;i<n;i++)
{
scanf("%s",&t);
int k=0;
for(int j=0;j<strlen(t);j++)
if((t[j]<='9'&&t[j]>='0')||(t[j]<='Z'&&t[j]>='A'&&t[j]!='Q'&&t[j]!='Z'))
{
s[k++]=dic[t[j]];
if(k==3)
s[k++]='-';
}
s[k]='\0';
//cout<<"s="<<s<<endl;
string ss=s;
mp[ss]++;
if(mp[ss]>1)
st.insert(ss);
}
if(st.empty())
printf("No duplicates. \n");
else while(!st.empty())
{
string t=*st.begin();
if(mp[t]>1)
cout<<t<<" "<<mp[t]<<endl;
st.erase(st.begin());
}
return 0;
}
只能改算法了。。看了题解发现要把字符串弄成数字处理(好巧妙啊Orz),然后就对应改了一发。。WA了。。因为没有注意前导0。。用%03d、%04d(突然发现超好用啊!)改了就过了。。
附上AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
using namespace std;
map<int,int>mp;
set<int>st;
map<char,int>dic;
void init()
{
dic['A']=dic['B']=dic['C']=2;
dic['D']=dic['E']=dic['F']=3;
dic['G']=dic['H']=dic['I']=4;
dic['J']=dic['K']=dic['L']=5;
dic['M']=dic['N']=dic['O']=6;
dic['P']=dic['R']=dic['S']=7;
dic['T']=dic['U']=dic['V']=8;
dic['W']=dic['X']=dic['Y']=9;
dic['0']=0;dic['1']=1;dic['2']=2;
dic['3']=3;dic['4']=4;dic['5']=5;
dic['6']=6;dic['7']=7;dic['8']=8;dic['9']=9;
}
int main()
{
int n;
init();
while(scanf("%d",&n)==1)
{
mp.clear();st.clear();
char s[1000];
for(int i=0;i<n;i++)
{
scanf("%s",s);
int l=strlen(s);
int k=0;
for(int j=0;j<l;j++)
{
if((s[j]<='9'&&s[j]>='0')||(s[j]<='Z'&&s[j]>='A'&&s[j]!='Q'&&s[j]!='Z'))
k=k*10+dic[s[j]];
}
//cout<<"i="<<i<<" k="<<k<<endl;
mp[k]++;
if(mp[k]>1)
st.insert(k);
}
if(st.empty())
printf("No duplicates.\n");
else
{
while(!st.empty())
{
int k=*st.begin();
if(mp[k]>1)
printf("%03d-%04d %d\n",k/10000,k%10000,mp[k]);//补充前导0
st.erase(st.begin());
}
}
}
return 0;
}