杭电ACM——1305,Immediate Decodability(Trie树)

num[i]:节点属性,表示在i节点是否为某个单词的结尾,即单词是否在这里结束,1是,0否。
突破口:
if(num[node]==1)
首先num[node]=1说明有单词是以node节点结束的,接下来搜索node下面是否有子节点,有的话说明有另外的单词以该单词为前缀,没有的话继续node++。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e3+5;
int Trie[maxn][2]={0};
int num[maxn]={0};
char s[10][15];
int tot=1,flag;
void insert(int n)
{
	int len,node,i,j;
	len=strlen(s[n])-1;node=0;
	for(i=0;i<=len;i++)
	{
		if(Trie[node][s[n][i]-'0']==0)
			Trie[node][s[n][i]-'0']=tot++;
		node=Trie[node][s[n][i]-'0'];
	}
	num[node]=1;
}
/*void inquire(int node)
{
	if(flag==0)
		return;
	if(num[node]==1)
	{
		if(Trie[node][0]!=0||Trie[node][1]!=0)
			flag=0;
		//return;
	}
	if(node>tot)
		return;
	inquire(node+1);
}*/
int main()
{
	int n,i,j,kase=1;
	n=0;flag=1;
	while(~scanf("%s",s[n]))
	{
		if(s[n][0]!='9')
		{
			insert(n);
			n++;
		}
		else
		{
			n=0;
			int node;
			for(node=0;node<tot;node++)
			{
				if(num[node]==1)
				{
					if(Trie[node][0]!=0||Trie[node][1]!=0)
						flag=0;
				}
				if(!flag)
					break;
			}
			if(flag)
				printf("Set %d is immediately decodable\n",kase++);
			else printf("Set %d is not immediately decodable\n",kase++);
			flag=tot=1;
			memset(num,0,sizeof(num));
			memset(Trie,0,sizeof(Trie));
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/shamansi99/article/details/89523288