HDU1251 统计难题【字典树】

来源:互联网 发布:数据分析师职业规划 编辑:程序博客网 时间:2024/05/22 04:37

题意:给出两个文本,问第二个文本某个字符串为前缀的单词数量(第一个文本中)


思路:map大法好,但不利于学算法,字典树可做


#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<stdlib.h>#include<math.h>#include<vector>#include<list>#include<map>#include<stack>#include<queue>#include<algorithm>#include<numeric>#include<functional>using namespace std;typedef long long ll;const int maxn = 1e6+5;struct data{int val;int next[26];}node[maxn];int cnt,ans;char s[maxn];void init(int i){node[i].val = 0;memset(node[i].next,-1,sizeof node[i].next);}void add(int x,int w){node[w].val++;if(s[x] == '\0')return;if(node[w].next[s[x]-'a'] == -1){init(cnt);node[w].next[s[x]-'a'] = cnt;cnt++;add(x+1,cnt-1);}elseadd(x+1,node[w].next[s[x]-'a']);}void fid(int x,int w){if(s[x] == '\0'){ans = node[w].val;return;}if(node[w].next[s[x]-'a'] == -1)return;elsefid(x+1,node[w].next[s[x]-'a']);}int main(void){init(0);cnt = 1;while(gets(s)){if(s[0] == '\0') break;add(0,0);}while(gets(s)){ans = 0;fid(0,0);printf("%d\n",ans);}return 0;}


原创粉丝点击