hihoCoder#1107 : Shortest Proper Prefix (前缀树)

题目大意:在n个单词中,如果以s作为前缀的单词个数不超过5个,那么称s为proper prefix。如果s为proper prefix并且s的任何一个前缀(不包括s)都不是proper prefix,那么称s为shortest proper prefix,找出词典中shortest proper prefix的个数。

题目分析:建立一棵trie,在trie上深搜即可。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<queue>
# include<list>
# include<set>
# include<map>
# include<string>
# include<cmath>
# include<cstdlib>
# include<algorithm>
using namespace std;
# define LL long long

const int N=1005;
const int INF=1000000000;
const LL oo=0x7fffffffffffffff;
const double eps=1e-10;

struct Node
{
	int u,l;
	Node(){}
	Node(int _u,int _l):u(_u),l(_l){}
};
int cnt,n;
int size[N*N<<1];
int tr[N*N<<1][26];

void init()
{
	cnt=1;
	memset(tr,0,sizeof(tr));
	memset(size,0,sizeof(size));
}

void insert(string p)
{
	int len=p.size();
	int u=0;
	for(int i=0;i<len;++i){
		int c=p[i]-'a';
		if(!tr[u][c]) tr[u][c]=cnt++;
		u=tr[u][c];
		++size[u];
	}
}

void dfs(int u,int &ans)
{
	if(u>0&&size[u]<=5){
		++ans;
	}else{
		for(int i=0;i<26;++i)
			if(tr[u][i]) dfs(tr[u][i],ans);
	}
}

int solve()
{	
	int ans=0;
	dfs(0,ans);
	return ans;
}

int main()
{
	string p;
	while(~scanf("%d",&n))
	{
		init();
		while(n--)
		{
			cin>>p;
			insert(p);
		}
		printf("%d
",solve());
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/20143605--pcx/p/5443324.html