题目大意:在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\n",solve());
}
return 0;
}