//题意:给你多个字符串为一组,然后空一行后输入询问的字符串,你要输出以该字符串为前缀的字符串数目。
//思路:如果要一一匹配真的是,不知道什么时候去了...所以使用字典树。这里使用数组去模拟。
#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; }