一个很烦的题目,修改了N遍,前面几次有超时和运行时错误的。最后虽然提交成功了,但是结果也很不理想,总结下错误原因吧:
首先,粗心错误,在没有重复时要输出No duplicates.
然后,输出排序问题,因为首先想到的快速查找方法是哈希表(用的是递推哈希),没考虑到递推时的排序,最后改为链式哈希。
1002 | Accepted | 3588K | 1235MS | C++ | 1742B |
代码:
#include<iostream>
#include<string>
#define MAX 50000
#define M 200
using namespace std;
struct Node
{
int initNum;
int times;
Node * next;
};
int main()
{
Node nodes[MAX];
int tnum,i,j,number,bit,set;
int tab[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0};
Node *p;
Node *temp;
Node *pre;
string s;
memset(nodes,0,MAX*sizeof(Node));
cin>>tnum;
for(i=0;i<tnum;i++)
{
cin>>s;
number=0;
for(j=0;j<s.size();j++)
{
if(s[j]<='Z'&&s[j]>='A')
{
bit=tab[s[j]-'A'];
number=number*10+bit;
}
else if(s[j]<='9'&&s[j]>='0')
{
bit=s[j]-'0';
number=number*10+bit;
}
}
//cout<<number<<endl;
set=number/M;
p=&nodes[set];
pre=&nodes[set];
while(p!=NULL)
{
if((p->initNum)<number)
{
pre=p;
p=p->next;
}
else
break;
}
if(p==NULL)
{
temp=new Node;
temp->initNum=number;
temp->times=1;
temp->next=NULL;
pre->next=temp;
}
else if(p->initNum==number)
{
p->times++;
}
else
{
temp=new Node;
temp->initNum=number;
temp->times=1;
temp->next=p;
pre->next=temp;
}
}
int mark=0;
for(i=0;i<MAX;i++)
{
temp=&nodes[i];
while(temp!=NULL)
{
if(temp->times>1)
{
mark++;
//cout<<temp->initNum<<" "<<temp->times<<endl;
int x=temp->initNum;
int bits[7];
for(j=0;j<7;j++)
{
bits[j]=x%10;
x/=10;
}
for(j=0;j<3;j++)
{
cout<<bits[6-j];
}
cout<<'-';
for(;j<7;j++)
{
cout<<bits[6-j];
}
cout<<" "<<temp->times<<endl;
}
temp=temp->next;
}
}
if(mark==0)
{
cout<<"No duplicates."<<endl;
}
//cin>>i;
return 0;
}