耽搁了很久的题目,突然想起来了这题还没做,这几天做了几道字典树,就拿来用字典树做一做。速度不是很快,空间用的很大。至少ac了……
#include<iostream>
#include<cstring>
using namespace std;
int n;
char tmp[100];//输入字符串
struct list
{
int val;//7位数字的值
int num[8];//7位数字
}s[100001];//输入的list
struct ans
{
int val;
int num[8];
}xx[101];//满足cnt>=2的list
struct Trie
{
int next[10];
int cnt;
void init(){memset(next,-1,sizeof(next));cnt=0;}
};
Trie T[200001];
int p,q=0;
int cmp(const void *a,const void *b)//按val值排序
{
struct ans *c=(ans*)a;
struct ans *d=(ans*)b;
return c->val>d->val?1:-1;
}
int turn(char c[],int t)//将字符串转换为数字
{
int i,j;
j=0;
for(i=0;i<strlen(c);i++)
{
if(c[i]>='A'&&c[i]<='C')
{
s[t].num[j++]=2;
}
else if(c[i]>='D'&&c[i]<='F')
{
s[t].num[j++]=3;
}
else if(c[i]>='G'&&c[i]<='I')
{
s[t].num[j++]=4;
}
else if(c[i]>='J'&&c[i]<='L')
{
s[t].num[j++]=5;
}
else if(c[i]>='M'&&c[i]<='O')
{
s[t].num[j++]=6;
}
else if(c[i]>='P'&&c[i]<='S')
{
s[t].num[j++]=7;
}
else if(c[i]>='T'&&c[i]<='V')
{
s[t].num[j++]=8;
}
else if(c[i]>='W'&&c[i]<='Y')
{
s[t].num[j++]=9;
}
else if(c[i]>='0'&&c[i]<='9')
{
s[t].num[j++]=c[i]-'0';
}
}
s[t].val=s[t].num[0]*1000000+s[t].num[1]*100000+s[t].num[2]*10000+s[t].num[3]*1000+s[t].num[4]*100+s[t].num[5]*10+s[t].num[6];
}
int build()//建树
{
p=1;
T[p].init();
return 0;
}
int insert(int c[],int t)//插入电话号码
{
int indx=1;
int i,j;
for(i=0;i<7;i++)
{
if(T[indx].next[c[i]]==-1)
{
T[indx].next[c[i]]=++p;
T[p].init();
}
indx=T[indx].next[c[i]];
}
T[indx].cnt++;
if(T[indx].cnt==2)
{
memcpy(xx[q].num,s[t].num,sizeof(s[t].num));
xx[q++].val=s[t].val;
}
}
int check(int c[])//查找>2的电话条目的cnt
{
int i;
int indx=1;
for(i=0;i<7;i++)
{
indx=T[indx].next[c[i]];
}
return T[indx].cnt;
}
int main()
{
int n;
int i,j;
scanf("%d",&n);
build();
for(i=1;i<=n;i++)
{
scanf("%s",tmp);
turn(tmp,i);
insert(s[i].num,i);
}
if(q==0)
{
printf("No duplicates.\n");
return 0;
}
else
{
qsort(xx,q,sizeof(xx[0]),cmp);
for(i=0;i<q;i++)
{
for(j=0;j<3;j++)
{
printf("%d",xx[i].num[j]);
}
printf("-");
for(;j<7;j++)
{
printf("%d",xx[i].num[j]);
}
printf(" ");
printf("%d\n",check(xx[i].num));
}
}
system("pause");
return 0;
}