zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    CSS的应用
    关于新手html的认识 以及对table的基本用法
    javascript的使用方法
    CSS的使用方式和选择器的用法
    html基础知识点
    前端课堂第四课
    前端课堂第三课
    前端实训第二课
    前端实训随笔
    JS02
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5443324.html
Copyright © 2011-2022 走看看