HDOJ 1251 统计难题 字典树

来源:互联网 发布:单片机复位原理 编辑:程序博客网 时间:2024/06/05 17:47

这题输入不习惯。处理输入废了不少时间。

在杭电oj上查看不少Accept提交的时间和空间,三叉树写的字典树无论是内存和时间上都优于大多数。


#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<cmath>#include<string>using namespace std;typedef int Nodelink;struct Node{Nodelink lson, subtree, rson;        int count;char ch;}Node[1000010];int top;Nodelink newNode(char ch){Node[++top].ch = ch;Node[top].lson = Node[top].rson = Node[top].subtree = Node[top].count = 0;return top;}void insert(int root, char str[]){Nodelink p = root;int len = strlen(str);for(int i = 0; i < len; i++){while(Node[p].ch != str[i]){if(str[i] < Node[p].ch){if(!Node[p].lson)Node[p].lson = newNode(str[i]);p = Node[p].lson;}else {if(!Node[p].rson)Node[p].rson = newNode(str[i]);p = Node[p].rson;}}if(!Node[p].subtree)Node[p].subtree = newNode('\0');p = Node[p].subtree;Node[p].count ++;}}int find(int top, char str[]){int len = strlen(str);Nodelink p = top;for(int i = 0; i < len; i++){while(str[i] != Node[p].ch){if(str[i] < Node[p].ch)if(!Node[p].lson)return 0;else p = Node[p].lson;elseif(!Node[p].rson)return 0;else p = Node[p].rson;}if(!Node[p].subtree)return 0;else p = Node[p].subtree;}return Node[p].count;}int main(){char str[12];top = 0;char ch;newNode('\0');while(ch = getchar()){if(ch == '\n')break;intstp = 0;str[stp++] = ch;while(ch = getchar()){if(ch == '\n')break;str[stp++] = ch;}str[stp] = '\0';insert(1, str);}int stp = 0;while(~scanf("%s", str)){stp = 0;stp = find(1, str);printf("%d\n",stp);}return 0;}


0 0
原创粉丝点击