题意:先输入测试次数:随后输入要输入的号码条例数量,这些输入的号码中如果有存在包含某个号码被包含,也就是这个号码是另一个号码的前缀,那就输出NO,否则输出YES。超时代码:动态创建结点,太耗时,dfs每个节点访问一次#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
struct node
{
node *next[10];
bool ex;
bool vis;
node()
{
this->vis = false;
this->ex= false;
for(int i=0;i<10;i++)
this->next[i]=NULL;
}
};
bool flag;
void insert(char *a,node *root)
{
node *cur = root;
int len = strlen(a);
for(int i=0;i<len;i++)
{
if(cur->next[a[i]-'0']==NULL)
{
node *newnode = new node;
cur->next[a[i]-'0'] = newnode;
if(cur->ex)flag = true; //先短后长
cur = cur->next[a[i]-'0'];
}
else
{
cur = cur->next[a[i]-'0'];
}
}if(cur->ex)flag = true;
cur->ex = true;
for(int i=0;i<10;i++) //先 长后短
if(cur->next[i]!=NULL)
flag = true;
}
void dfs(node *root)//深搜 ,遍历所有结点
{
node *cur = root;
for(int i=0;i<10;i++)
{
if(cur->next[i]!=NULL&&cur->next[i]->vis==false)//不为空且没有访问
{
node *last = cur;
if(cur->ex==true)
{
flag = true;
break;
}
cur = cur->next[i];
cur->vis = true;
dfs(cur);
cur = last;
}
}
}
int main()
{
char c[11];
int t,n;
scanf("%d",&t);
while(t--)
{
flag = false;
scanf("%d",&n);
node *tempr = new node;
for(int i=0;i<n;i++)
{
scanf("%s",c);
insert(c,tempr);
}
if(flag)printf("NO\n");
else printf("YES\n");
delete tempr;
}
}
AC代码:静态创建结点 ,十个号码,可以输入10000条,每次输入最多100000个结点,所以静态创建这么多结点
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
struct tire
{
tire *next[10];
bool ex;
tire()
{
ex= false;
for(int i=0; i<10; i++)
next[i]=NULL;
}
};
tire node[100000];
int num=0;
bool flag;
void insert(char *a)
{
int i=0;
int len = strlen(a);
tire *cur = &node[0];
for(i;i<len;i++)
{
if(cur->next[a[i]-'0']==NULL)
{
cur->next[a[i]-'0']=&node[++num];
if(cur->ex)flag = true;//先输入短的
}
cur = cur->next[a[i]-'0'];
}
if(cur->ex)
flag = true;//相同输入
for(int j=0;j<10;j++)//先输入长的
if(cur->next[j]!=NULL)
flag = true;
cur->ex = true;
}
int main()
{
char c[11];
int t,n;
scanf("%d",&t);
while(t--)
{
flag = false;
memset(node,NULL,100000*sizeof(tire));//记得清空为0
num = 0; //全局变量也得重新变为0,不然node数组越界RE
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%s",c);
insert(c);
}
if(flag)printf("NO\n");
else printf("YES\n");
}
}
465

被折叠的 条评论
为什么被折叠?



