【ybt高效进阶2-4-1】前缀统计

91 篇文章 0 订阅

前缀统计

题目链接:ybt高效进阶2-4-1

题目大意

有一堆字符串,然后每次有一个询问,问一个有多少个字符串是一个给出的字符串的前缀。

思路

这道题可以看出用 Trie 树(甚至有点模板),就建树就普通的建。
至于询问,其实我们可以按着长度推 Trie 数的位置,每次长度都是一个前缀。然后答案加上就可以。

当然,我们在询问的时候已经不用再重新建树,遇到没有这个分支的就可以直接结束了。

代码

#include<cstdio>
#include<cstring>

using namespace std;

struct Trie {
	char x;
	int son[301], end;
}trie[1000001];
int n, m, cn, now, KK, re;
char c[1000001];

void build() {//建Trie树
	now = 0;
	for (int i = 0; i < cn; i++) {
		if (!trie[now].son[c[i]]) {
			trie[now].son[c[i]] = ++KK;
			trie[now].x = c[i];
		}
		now = trie[now].son[c[i]];
	}
	trie[now].end++; 
}

int find() {
	now = 0;
	re = 0;
	for (int i = 0; i < cn; i++) {
		if (!trie[now].son[c[i]]) return re;
		
		now = trie[now].son[c[i]];
		re += trie[now].end;//一个一个前缀找
	}
	return re;
}

int main() {
	scanf("%d %d", &n, &m);
	
	for (int i = 1; i <= n; i++) {
		scanf("%s", c);
		cn = strlen(c);
		
		build();
	}
	
	for (int i = 1; i <= m; i++) {
		scanf("%s", c);
		cn = strlen(c);
		
		printf("%d\n", find());
	}
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值