#include
#include
#include
using namespace std;
int tep[100100];
int biao[26]={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,9};
int main()
{
//OPEN_IN;
int i,j,t=0,count,n,flag=1;;
char h[100];
scanf("%d",&n);
for(i=0;i
int len=strlen(h);
int m1=1,m2;
for(m2=len-1;m2>=0;m2--){//从后到前扫,也可从前到后扫,看各人习惯,从前到后,可以不用m1,每次直接把tep[i]乘10在加当前的数即可
if(h[m2]=='-') continue;
if(h[m2]<'A') tep[i]+=(h[m2]-'0')*m1;//数字
else tep[i]+=biao[h[m2]-'A']*m1;//字母
m1=10*m1;//m1维护一个基数
}
}
sort(tep,tep+n);//C++的快排,从小到大,不知道的话,你把它改成qsort也行,用sort主要是觉得方便
tep[n]=-1;
count=1;
for(i=1;i<=n;i++){
if(tep[i]==tep[i-1]) count++;
else {
if(count>1) {
flag=0;
printf("%03d-%04d %d\n",tep[i-1]/10000,tep[i-1]%10000,count);
}
count=1;
}
}
if(flag) printf("No duplicates.\n");
//while(1);
return 0;
}
思想其实非常简单,把字符串扫一遍,遇到-不处理,遇到数字直接加,遇到字母转化之后再加。把字符串转化为数字主要是因为对字符串排序比对数组排序慢的多。
下面是我帮你改的程序,已经AC
#include
#include
#include
using namespace std;
char a[100002][100];//输入数据‘-’可能很多
char b[100002][20];//至少开8,留一个存储'\0'
int mark[100002]={0};
//int comp(const void*b,const void*a);
int comp(const void*b,const void*a)//////////////////////
{
return strcmp((char*)b,(char*)a);
}
int main()//在poj如果用C++提交,main要为int型
{
int n,i,j,k;
int count,flag=0;
int num[26]={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,9};
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",a[i]);
}
for (i=1;i<=n;i++)
{
k=0;
for(j=0;a[i][j]!='\0';j++)
{
if(a[i][j]>='A'&&a[i][j]<='Z')
a[i][j]=num[a[i][j]-'A']+'0';//变为字符
if(a[i][j]!='-')
{
b[i][k]=a[i][j];
k++;
}
}
}
qsort(b+1,n,sizeof(b[0]),comp);//因为你b[0],没存东西,从b+1开始排序
for (i=1;i<=n;i++)
{
if(mark[i]) continue;//标记了,直接跳过
count=1;
for (j=i+1;j<=n;j++)
{
if (strcmp(b[i],b[j])==0)
{
count++;
mark[j]=1;
}
else break;//不加break会T
}
if (count>1)
{
flag=1;
for (j=0;j<3;j++)
{
printf("%c",b[i][j]);
}
printf("-");
for(j=3;j<7;j++)
printf("%c",b[i][j]);
printf(" %d\n",count);
}
}
if(flag==0)
printf("No duplicates.\n");
}
不加beark每次搜索时都要搜到n,这就是n^2的复杂度,肯定要T,改过之后那一句if加不加都无所谓,因为他们不可能为0,如果要加的话,这么写
if (mark[i]==0&&mark[j]==0){
if (strcmp(b[i],b[j])==0)
{
count++;
mark[j]=1;
}
else break;//不加break会T
}
qsort函数第三个参数是每个元素所占用的字节数,参与排序的元素是每个字符串,也就是b[1],b[2],b[3]……b[n],因为原来你开的是b[][7],所以可以写sizeof(char)*7,开成20后也可以写成sizeof(char)*20,与sizeof(b[0])等效,里面的b[0]也可以b[1]等等,他们表示的大小是一样的,都是20个字节。
ACM加油!!!