zoukankan      html  css  js  c++  java
  • hihoCoder#1014 Trie树 (前缀树)

    题目大意:给一本有n个单词的词典,有m次询问,每次询问的是该词典中有多少个单词有共同的某个前缀。

    题目分析:在添加单词建立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;
    
    string p;
    int len[N*1000];
    int cnt;
    int tr[N*1000][26];
    
    void insert()
    {
    	int u=0;
    	int n=p.size();
    	for(int i=0;i<n;++i){
    		int c=p[i]-'a';
    		if(!tr[u][c]){
    			memset(tr[cnt],0,sizeof(tr[cnt]));
    			tr[u][c]=cnt++;
    		}
    		u=tr[u][c];
    		++len[u];
    	}
    }
    
    int query()
    {
    	int n=p.size();
    	int u=0;
    	for(int i=0;i<n;++i){
    		if(!tr[u][p[i]-'a'])
    			return 0;
    		u=tr[u][p[i]-'a'];
    	}
    	return len[u];
    }
    
    int main()
    {
    	int n,m;
    	while(~scanf("%d",&n))
    	{
    		cnt=1;
    		memset(len,0,sizeof(len));
    		memset(tr,0,sizeof(tr));
    		while(n--)
    		{
    			cin>>p;
    			insert();
    		}
    		scanf("%d",&m);
    		while(m--)
    		{
    			cin>>p;
    			printf("%d
    ",query());
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    函数指针的调用方式
    C++构造函数和析构函数顺序
    往android主项目中添加辅助项目
    Qt每次运行都是重新编译问题
    函数参数检验的研究
    动态链接库和静态链接库的区别(未完待续)
    MySQL 查看最大连接数, 当期连接数.
    Linux 命令
    Ext treelist 动态切换TreeStore
    Java 日期加减计算.
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5441479.html
Copyright © 2011-2022 走看看