HDU——1251 统计难题

来源:互联网 发布:vmware10 for mac下载 编辑:程序博客网 时间:2024/06/05 15:26

题意:这次是中文自己看。

解题思路:要用到字典树(研究了好几天的字典树,终于算是知道字典树大概写法了),详细的解释看代码注释。

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;}

0 0