| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
字典树+DFS,WA得快哭了,我把OJ上所有的测试数据都找来了下面的代码是交给UVA上的,格式和这有点不同,但是算法是一样的。
我把所有的测试数据跑了一遍,大致看了下没找到错误,uva上跑了500毫秒左右WA掉,跪求错误数据或BUG
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct trie
{
struct trie * next[10];
int count;
};
struct trie * ROOT = NULL;
char BOX[50];
int FLAG;
void insert(char * s);
void dfs(struct trie * temp,int len);
int main(void)
{
//freopen("txt.txt","r",stdin);
int t,n,len;
char s[50],number[50];
scanf("%d",&t);
while(t --)
{
FLAG = 1;
ROOT = (struct trie *)malloc(sizeof(struct trie));
for(int i = 0;i < 10;i ++)
ROOT -> next[i] = NULL;
ROOT -> count = 0;
scanf("%d",&n);
while(n --)
{
len = 0;
scanf("%s",s);
for(int i = 0;s[i];i ++) //转化成纯数字形式插入字典树
{
if(s[i] >= '0' && s[i] <= '9')
number[len ++] = s[i];
else if(s[i] == 'A' || s[i] == 'B' || s[i] == 'C')
number[len ++] = '2';
else if(s[i] == 'D' || s[i] == 'E' || s[i] == 'F')
number[len ++] = '3';
else if(s[i] == 'G' || s[i] == 'H' || s[i] == 'I')
number[len ++] = '4';
else if(s[i] == 'J' || s[i] == 'K' || s[i] == 'L')
number[len ++] = '5';
else if(s[i] == 'M' || s[i] == 'N' || s[i] == 'O')
number[len ++] = '6';
else if(s[i] == 'P' || s[i] == 'R' || s[i] == 'S')
number[len ++] = '7';
else if(s[i] == 'T' || s[i] == 'U' || s[i] == 'V')
number[len ++] = '8';
else if(s[i] == 'W' || s[i] == 'X' || s[i] == 'Y')
number[len ++] = '9';
}
number[len] = '\0';
insert(number);
}
dfs(ROOT,0);
if(FLAG)
puts("No duplicates.");
if(t)
puts("");
}
return 0;
}
void insert(char * s) //字典树插入函数
{
struct trie * temp = ROOT;
for(int i = 0;s[i];i ++)
if(temp -> next[s[i] - '0'])
temp = temp -> next[s[i] - '0'];
else
{
temp -> next[s[i] - '0'] = (struct trie *)malloc(sizeof(struct trie));
for(int j = 0;j < 10;j ++)
temp -> next[s[i] - '0'] -> next[j] = NULL;
temp -> next[s[i] - '0'] -> count = 0;
temp = temp -> next[s[i] - '0'];
}
temp -> count ++;
return ;
}
void dfs(struct trie * temp,int len) //深搜
{
for(int i = 0;i < 10;i ++)
if(temp -> next[i])
{
BOX[len] = i + '0';
len ++;
if(temp -> next[i] -> count >= 2)
{
FLAG = 0;
BOX[len] = '\0';
for(int j = 0;BOX[j];j ++)
{
if(j == 3)
putchar('-');
printf("%c",BOX[j]);
}
printf(" %d\n",temp -> next[i] -> count);
continue;
}
dfs(temp -> next[i],len);
len --;
}
return ;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator