题意:这次是中文自己看。
解题思路:要用到字典树(研究了好几天的字典树,终于算是知道字典树大概写法了),详细的解释看代码注释。
Code:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct Trie
{
Trie *next[26];//用于存放子节点的地址
int v;//记录以该节点为根的树叶子节点的个数
};
Trie *root;//根节点
Trie *newnode()//初始化每个新节点
{
Trie *t;
t = new Trie;
for(int i = 0; i < 26; i++)
t->next[i] = NULL;
return t;
}
void CreatTrie(char *str)//创建字典树
{
Trie *q, *p = root;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
int id= str[i]-'a';//得出i节点的编号
if(p->next[id] == NULL)//如果第id个节点为空,则创建新节点
{
q = newnode();
q->v = 1;//并且将以该节点为根的树的叶子节点个数初始化为1
p->next[id] = q;
p = p->next[id];
}
else
{
p->next[id]->v++;//如果第id个节点不为空,则v++
p = p->next[id];//指针向下移动
}
}
}
int search(char *str)
{
Trie *p = root;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
int id = str[i] - 'a';
p = p->next[id];//每次都先进行移动,然后进行判断
if(p == NULL) return 0;//若为空,则直接跳出
}
return p->v;//最后返回p结点的v值
}
int main()
{
//freopen("input.txt","r",stdin);
char array[26];
int flag = 1;//首先设置一个标识变量
root = newnode();
while(gets(array))
{
int len = strlen(array);
if(len == 0) { flag = 0; continue; }//利用空行的长度来进行由CreatTrie()到search()的切换
if(flag) CreatTrie(array);
else
{
int num = search(array);
printf("%d\n",num);
}
}
return 0;
}