初看起来,这道题很简单,我以为很快能搞定,结果花了两个晚上。其实是处理字符串不熟练,加上犯些比较白痴又不容易看出来的小错误,排序总出问题,好不容易出了样例的正确结果,一提交,结果TLE。qsort,sort我都基本不会用,还好,有5isoft同志的热心帮忙,把排序搞定了,然后再处理一下累计次数,就AC了。调程序调到脾气暴躁了,可怜了我的键盘啊……
未央C++博客代码:
Source Code
Problem: 1002 |
|
User: wic |
Memory: 1528K |
|
Time: 485MS |
Language: C++ |
|
Result: Accepted |
- Source Code
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int map[25]={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};
char a[100002][9];
char b[9],c[50];
int aa[100002];
int comp(const void *p1, const void *p2)//快排的比较标准
{
return (strcmp(( char*)p1,(char*)p2));
}
int main()
{
int n,i,j=0,k=0,l,m;
cin>>n;
b[3]='-';
for(j=0; j<n; j++){
scanf("%s",c);
l=strlen(c);
m=0;
for(i=0; i<l; i++){
if(m==3)
m++;
if(c[i]<='9'&&c[i]>='0')
b[m]=c[i];
else if(c[i]<'Z'&&c[i]>='A')
b[m]=map[c[i]-'A']+'0';
else
continue;
m++;
}
strcpy(a[j],b);
}
qsort(a,n,9,comp);//最关键的排序
for(i=0; i<n; i=k)//这个方法是曾经听lzm同学的思想,代码是自己实现的
for(j=i+1; j<=n; j++){
if(strcmp(a[i],a[j])==0)
aa[i]++;
else
{ k=j; break;}
}
int have=0;
for(i=0; i<n; i++)
if(aa[i]>0){
printf("%s %d\n",a[i],aa[i]+1);
have=1;
}
if(have==0)
printf("No duplicates.\n");
return 0;
}
|