poj 1002 487-3279 // hoj 1347 487-3279
2012-05-07 10:34
316 查看
/*
trie树建立,然后递归打印所有的电话号码(统计次数大于1的打印出来),内存在HOJ上爆了,应该是递归时爆栈了。。。第二个代码两个都是可以AC的,要注意POJ上是只输入一个案例,HOJ上输入多个样例
第二个
*/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define X 125
char s[X];
int n;
struct trie
{
int id;
trie *p[10];
char s[X];
trie()
{
id = 0;
memset(p,NULL,sizeof(p));
}
}root;
int ma[] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};
void insert(trie *r)
{
int c,cnt = 0;
char temp[10];
for(int i=0;s[i];i++)
{
c = -1;
if(s[i]>='0'&&s[i]<='9')
c = s[i]-'0';
else if(s[i]>='A'&&s[i]<='Z')
c = ma[s[i]-'A'];
if(c==-1)
continue;
temp[cnt++] = c+'0';
if(r->p[c]==NULL)
r->p[c] = new trie();
r = r->p[c];
}
temp[7] = '\0';
strcpy(r->s,temp);
r->id++;
}
bool flag;
void print(trie *r)
{
for(int i=0;i<10;i++)
{
if(r->p[i]!=NULL)
print(r->p[i]);
if(r->id>1)
{
flag = true;
for(int j=0;j<7;j++)
{
if(j==3)
printf("-");
printf("%c",r->s[j]);
}
printf(" %d\n",r->id);
r->id = 0;
}
}
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
flag = false;
trie *r = &root;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
insert(r);
}
print(r);
if(!flag)
cout<<"No duplicates."<<endl;
return 0;
}
HOJ AC的代码,同样是trie树+递归打印
1.47s,21240k
#include <cstdio>
#include <cstring>
#define X 125
char s[X];
int n;
struct trie
{
int id;
trie *p[10];
trie()
{
id = 0;
memset(p,NULL,sizeof(p));
}
}root;
int ma[] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};
void insert(trie *r)
{
int c;
for(int i=0;s[i];i++)
{
c = -1;
if(s[i]>='0'&&s[i]<='9')
c = s[i]-'0';
else if(s[i]>='A'&&s[i]<='Z')
c = ma[s[i]-'A'];
if(c==-1)
continue;
if(r->p[c]==NULL)
r->p[c] = new trie();
r = r->p[c];
}
r->id++;
}
bool flag;
void print(trie *r,char temp[],int cnt)
{
for(int i=0;i<10;i++)
{
if(r->p[i]!=NULL)
{
temp[cnt] = '0'+i;
print(r->p[i],temp,cnt+1);
}
if(r->id>1)
{
flag = true;
for(int j=0;j<7;j++)
{
if(j==3)
printf("-");
printf("%c",temp[j]);
}
printf(" %d\n",r->id);
r->id = 0;
}
else
r->id = 0;
}
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
flag = false;
trie *r = &root;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
insert(r);
}
char temp[10];
print(r,temp,0);
if(!flag)
printf("No duplicates.\n");
if(t)
printf("\n");
}
return 0;
}
trie树建立,然后递归打印所有的电话号码(统计次数大于1的打印出来),内存在HOJ上爆了,应该是递归时爆栈了。。。第二个代码两个都是可以AC的,要注意POJ上是只输入一个案例,HOJ上输入多个样例
39268K | 938MS |
14232K | 891MS |
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define X 125
char s[X];
int n;
struct trie
{
int id;
trie *p[10];
char s[X];
trie()
{
id = 0;
memset(p,NULL,sizeof(p));
}
}root;
int ma[] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};
void insert(trie *r)
{
int c,cnt = 0;
char temp[10];
for(int i=0;s[i];i++)
{
c = -1;
if(s[i]>='0'&&s[i]<='9')
c = s[i]-'0';
else if(s[i]>='A'&&s[i]<='Z')
c = ma[s[i]-'A'];
if(c==-1)
continue;
temp[cnt++] = c+'0';
if(r->p[c]==NULL)
r->p[c] = new trie();
r = r->p[c];
}
temp[7] = '\0';
strcpy(r->s,temp);
r->id++;
}
bool flag;
void print(trie *r)
{
for(int i=0;i<10;i++)
{
if(r->p[i]!=NULL)
print(r->p[i]);
if(r->id>1)
{
flag = true;
for(int j=0;j<7;j++)
{
if(j==3)
printf("-");
printf("%c",r->s[j]);
}
printf(" %d\n",r->id);
r->id = 0;
}
}
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
flag = false;
trie *r = &root;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
insert(r);
}
print(r);
if(!flag)
cout<<"No duplicates."<<endl;
return 0;
}
HOJ AC的代码,同样是trie树+递归打印
1.47s,21240k
#include <cstdio>
#include <cstring>
#define X 125
char s[X];
int n;
struct trie
{
int id;
trie *p[10];
trie()
{
id = 0;
memset(p,NULL,sizeof(p));
}
}root;
int ma[] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,-1,7,7,8,8,8,9,9,9,-1};
void insert(trie *r)
{
int c;
for(int i=0;s[i];i++)
{
c = -1;
if(s[i]>='0'&&s[i]<='9')
c = s[i]-'0';
else if(s[i]>='A'&&s[i]<='Z')
c = ma[s[i]-'A'];
if(c==-1)
continue;
if(r->p[c]==NULL)
r->p[c] = new trie();
r = r->p[c];
}
r->id++;
}
bool flag;
void print(trie *r,char temp[],int cnt)
{
for(int i=0;i<10;i++)
{
if(r->p[i]!=NULL)
{
temp[cnt] = '0'+i;
print(r->p[i],temp,cnt+1);
}
if(r->id>1)
{
flag = true;
for(int j=0;j<7;j++)
{
if(j==3)
printf("-");
printf("%c",temp[j]);
}
printf(" %d\n",r->id);
r->id = 0;
}
else
r->id = 0;
}
}
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
flag = false;
trie *r = &root;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
insert(r);
}
char temp[10];
print(r,temp,0);
if(!flag)
printf("No duplicates.\n");
if(t)
printf("\n");
}
return 0;
}
相关文章推荐
- POJ 1002 UVA 755 487--3279 电话排序 简单但不容易的水题
- poj 1002-487-3279
- poj 1002 487-3279
- poj1002 487-3279(STL map应用)
- POJ-1002-487-3279
- poj 1002:487-3279(水题,提高题 / hash)
- POJ 1002 487-3279
- poj 1002 487-3279
- [POJ][1002]487-3279
- poj 1002 "487-3279"
- POJ 1002 487-3279
- poj 1002 487-3279
- POJ-1002 487-3279 模拟问题
- POJ 1002 487-3279
- POJ 1002 487-3279 字符串处理
- POJ 1002 487-3279
- POJ 1002 487-3279(快排)
- POJ 1002 487-3279 (模拟 水题)
- POJ 1002_487-3279
- poj 1002 487-3279