• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ACM s1124yy
守りたいものが 強くさせること
博客园    首页    新随笔    联系   管理     

hiho #1014 : Trie树(模板)

Trie树

【题目链接】Trie树

&题意:

输入
输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。
n, m<=100000,词典的字母表大小<=26.

输出
对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

&题解:

Trie蓝书模板

&代码:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int maxNo= 1000000 +7,sSi=26;
struct Trie {
	int ch[maxNo][sSi],val[maxNo],sz;
	void init() {sz=1; memset(ch[0],0,sizeof(ch[0])); memset(val,0,sizeof(val));}
	int idx(char c) {return c-'a';}
	void insert(char *s) {
		int u=0;
		for(int i=0; s[i]; i++) {
			int c=idx(s[i]);
			if(!ch[u][c]) {
				memset(ch[sz],0,sizeof(ch[sz]));
				ch[u][c]=sz++;
			}
			u=ch[u][c];
			val[u]++;
		}
	}
	int query(char *s) {
		int u=0;
		for(int i=0; s[i]; i++) {
			int c=idx(s[i]);
			if(!ch[u][c]) return 0;
			u=ch[u][c];
		}
		return val[u];
	}
} tr;
int n,m;
char s[20];
int main() {
	freopen("E:1.in","r",stdin);
	while(~scanf("%d",&n)) {
		tr.init();
		for(int i=0; i<n; i++) {
			scanf("%s",s);
			tr.insert(s);
		}
		scanf("%d",&m);
		// for(int i=0; i<5; i++) {
		// 	printf("%d ",tr.val[i]);
		// } puts("");
		for(int i=0; i<m; i++) {
			scanf("%s",s);
			// puts(s);
			printf("%d\n",tr.query(s));
		}
	}
	return 0;
}
posted @ 2017-04-13 21:19  s1124yy  阅读(158)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3