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

发布于 2020-02-16  10 次阅读


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
	}
}


届ける言葉を今は育ててる
最后更新于 2020-02-16