HDU-1251 统计难题(字典树)

//题意:给你多个字符串为一组,然后空一行后输入询问的字符串,你要输出以该字符串为前缀的字符串数目。

//思路:如果要一一匹配真的是,不知道什么时候去了...所以使用字典树。这里使用数组去模拟。

#include <iostream>
#include <stdio.h>
using namespace std;

int trie[1000010][26];    //数组形式定义字典树,值存储的是下一个字符的位置
int num[1000010]={0};    //附加值,以某一字符串为前缀的单词的数量
int pos = 1;


void Insert(char *word){
    int i;
    int p =0;//指针位置(统计数组num的指针)
    for(int i=0;i<strlen(word);i++){
        int n = word[i] - 'a';
        if(trie[p][n]==0){//如果对应当前位置没有值
            trie[p][n] = pos++;
        }
        p = trie[p][n];//从trie树中得到指向下一个方向的位置
        num[p]++;//p结点位置加一
    }

}
int Find(char *word){
    int i;
    int p = 0;
    for(i  =0;i<strlen(word);i++){
        int n = word[i] - 'a';
        if(trie[p][n]==0){
            return 0;
        }
        p = trie[c][n];//如果没有出现这个前缀则输出为0
    }
    return num[p];
}


int main()
{
    char word[11];
    while(gets(word)){
        if(!strlen(word))    //如果word的长度为0
            break;
        Insert(word);
    }
    while(gets(word))
        printf("%d
",Find(word));
    return 0;
}
原文地址:https://www.cnblogs.com/Tianwell/p/11342096.html