Prefix Code(数组型前缀字典树)

题意:大概就是,给T组测试样例,每组N个数据,在这N个数据中,查找前缀和,例如(5是55的前缀。 13是13485的前缀)如果N个数据中有前缀则输出NO反之输出Yes。
因为是ICPC的比赛,虽然过题时间有5s,但是暴力肯定是会超时,只能使用前缀字典树过题。
代码:
#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>
#define ll long long
#define LL __int64
const ll INF=9999999999999
using namespace std
#define M 400000100
#define inf 0xfffffff
int Trie[100002][11]
int node[100002]
int value[100002]
int sizeofTrie
void clear()
{
memset(Trie[0],0,sizeof(Trie[0]))
memset(node,0,sizeof(node))
memset(value,0,sizeof(node))
sizeofTrie=1
}
bool buildTrie(char *s)
{
bool have_build=0
int u=0,len=strlen(s)
for(int i=0i<leni++)
{
int v=s[i]-'0'
if(!Trie[u][v])
{
memset(Trie[sizeofTrie],0,sizeof(Trie[sizeofTrie]))
Trie[u][v]=sizeofTrie++
have_build=1
}
if(node[u]==1)
return 0
u=Trie[u][v]
}
if(node[u]==1)
return 0
node[u]=1
return have_build
}
int main(void)
{
char s[22]
int n
int t
int q=1
cin>>t
while(t--)
{
clear()
scanf("%d",&n)
bool flag=1
for(int i=0i<ni++)
{
scanf("%s",s)
if(flag)
flag=buildTrie(s)
}
if(flag)
cout<<"Case #"<<q++<<": Yes"<<endl
else
cout<<"Case #"<<q++<<": No"<<endl
}
}





Comments NOTHING