zoukankan      html  css  js  c++  java
  • #Trie Trie字典树

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int trie[100050][26];
    int num[1000010];
    int pos=1;//新建节点时用的序数,也就是已有的节点的序数(1 2 3...p);注意pos必须是1,0的话相当于放弃第一个节点
    void Insert(string str){
    	int c=0;//c代表字典序,pos 
    	for(int i=0;i<str.size();i++){//遍历字符串 
    		int n=str[i]-'a';//字符转化为数值; 
    		if(trie[c][n]==0)//第c行里没有出现过n的时候 字典里没有出现的时候 
    			trie[c][n]=pos++;//用pos新建节点(第c行的第n节点的下一个节点位置是pos) 
    		c=trie[c][n];//c变为第c行的第n个数,模拟字典遍历 
    		++num[c];//c(某节点,某前缀的出现次数)的出现次数+1;在这里出现就是记录前缀出现次数 
    	} 
    //		num[c]++;//c的出现次数+1; //在这里出现就是记录字符串出现次数。 
    }
    int Find(string str){
    	int c=0;
    	for(int i=0;str[i];i++){
    		int n=str[i]-'a';
    		if(trie[c][n]==0)//trie[c][n]是位置,为0代表没有; 
    			return 0;
    		c=trie[c][n];
    	}
    	return num[c];
    }
    int main(){
    	memset(num,0,sizeof(num)); 
    	string str;
    	while(getline(cin,str)){//不断读入,插入; 
    		if(!str.size()) break;
    		Insert(str);//插入函数; 
    	}
    	while(getline(cin,str)) cout<<Find(str)<<endl;
    	return 0;
    }
    
  • 相关阅读:
    %2d
    将块中的文字设置成属性,即实现块中文字可拖动的功能
    获得块参照的插入点方法
    排序
    将几个实体对象变成一个块
    对克隆实体的类型转换
    对实体的克隆
    递归-顺序输出任意正整数各位
    递归-汉诺塔
    递归-最大公约数
  • 原文地址:https://www.cnblogs.com/yuanyulin/p/14026718.html
Copyright © 2011-2022 走看看