AcWing 142. 前缀统计 字典树打卡

给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1~SNSN中有多少个字符串是T的前缀。

输入字符串的总长度不超过106106,仅包含小写字母。

输入格式

第一行输入两个整数N,M。

接下来N行每行输入一个字符串SiSi。

接下来M行每行一个字符串T用以询问。

输出格式

对于每个询问,输出一个整数表示答案。

每个答案占一行。

输入样例:

3 2
ab
bc
abc
abc
efg

输出样例:

2
0

题意:让你计算前面有多少个字符串是查询的这个字符串的前缀思路:这是字符串的题,在字符串算法中和前缀有关的是字典树,模板中是计算这个串是多少个串的前缀,其实这题大同小异,我们在前面插入的时候最后那个节点才加一,然后查询时直接加上沿途所有的值
#include<bits/stdc++.h>
#define maxn 1000005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m;
char str[maxn];
ll tree[maxn][26];
ll sum[maxn];
ll top;
void insert(){
    int len=strlen(str);
    ll root=0;
    for(int i=0;i<len;i++){
        ll x=str[i]-‘a‘;
        if(!tree[root][x]) tree[root][x]=++top;
        root=tree[root][x];
     }
     sum[root]++;//因为是要计算有多少个字符串是查询的前缀就只能当前节点加一了
}
ll query(){
    ll num=0;
    ll root=0;
    for(int i=0;str[i]!=‘\0‘;i++){
        ll x=str[i]-‘a‘;
        if(!tree[root][x]) return num;
        root=tree[root][x];
        num+=sum[root];//加上以当前节点结尾的字符串个数
    }
    return num;
}
int main(){
    scanf("%lld%lld",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s",str);
        insert();
    }
    for(int j=0;j<m;j++){
        scanf("%s",str);
        cout<<query()<<"\n";
    }
} 
 

原文地址:https://www.cnblogs.com/Lis-/p/10896359.html

时间: 2024-10-03 00:54:15

AcWing 142. 前缀统计 字典树打卡的相关文章

# 前缀统计~[字典树]

前缀统计~[字典树] 传送门 题意 给出N个字符串,进行M次询问,每次给出一个字符串,询问N个字符串中有多少个是它的前缀. 思路 字典树Trie入门题. 字典树最典型的应用就是用来存储字符串. 其中每个节点下有26个子节点(对应26个字母),根据新建节点的顺序使用idx为节点编号,根节点和空节点编号都为0,每个叶节点维护一个cnt,标记以这个叶节点结尾的字符串有几个. 使用这种存储方式可以很容易查找一个字符串是否存在,以及出现过几次等等. Code: #include <bits/stdc++.

acwing 142. 前缀统计

题面: 给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1-SNSN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106106,仅包含小写字母. 输入格式 第一行输入两个整数N,M. 接下来N行每行输入一个字符串SiSi. 接下来M行每行一个字符串T用以询问. 输出格式 对于每个询问,输出一个整数表示答案. 每个答案占一行. 输入样例: 3 2 ab bc abc abc efg 输出样例: 2 0题解:这是比较裸的trie题 #in

51nod round3# 序列分解(折半枚举+字典树)

小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n的整数序列.小刀试着把这个序列分解成两个长度为n/2的子序列. 这两个子序列必须满足以下两个条件: 1.他们不能相互重叠. 2.他们要完全一样. 如果小刀可以分解成功,大刀会给小刀一些糖果. 然而这个问题对于小刀来说太难了.他想请你来帮忙. Input 第一行给出一个T,表示T组数据.(1<=T<=5) 接下来每一组数据,输入共2行. 第一行包含一个整数n (2<=n<=40且为偶数). 第二行给出n

LightOJ 1269 - Consecutive Sum(字典树)

题目链接:LightOJ 1269 - Consecutive Sum 题目大意:给定一个序列,选定一段区间的亦或和,输出最大和最小. 解题思路:最大很简单,对所有前缀建立字典树,然后尽量往反向走:最小则需要往正向走,并且向正向走的时候要扣 除自己本身. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 50005 * 32; c

Barty&#39;s Computer 字典树

https://nanti.jisuanke.com/t/17122 Barty have a computer, it can do these two things. Add a new string to its memory, the length of this string is even. For given 44 strings a,b,c,da,b,c,d, find out how many strings that can be product by a+s1+b+c+s2

hdu 4760 Good Firewall(字典树)

题目链接:hdu 4760 Good Firewall 题目大意:有一个防火墙,具有添加一个子网络,删除一个子网络,以及转发包的操作. 添加操作包含子网络的id,以及子网络的子网掩码(计算出网络前缀,以及ip的下限),不会超过15个. 删除则是给定要删除的子网络id. 转发操作,给定两个ip,如果两个ip在同一个子网络中,则可以转发,否则丢弃. 解题思路:对子网掩码前缀建立字典树,每个前缀终止节点用一个set记录属于哪些子网络,ip下限.那么增加和删除操 作既可以解决了.对于查询操作,分别查询两

POJ 2513 Colored Sticks(字典树+并查集连通性+欧拉回路)

题目地址:POJ 2513 刚开始没想到字典树,用的map函数一直TLE,由于上一次的签到题由于没想到字典树而卡了好长时间的深刻教训,于是过了不久就想起来用字典树了,(为什么是在TLE了5次之后..T^T)然后把map改成了字典树,然后就过了. 这题居然不知不觉的用上了欧拉回路..其实当时我是这样想的..因为相互接触的必须要相同,所以除了两端外,其他的都是两两相同的,所以除了两端的颜色外其他的的个数必须为偶数.然后两端的可能相同可能不相同,相同的话,说明所有的都是偶数个数了,不相同的话那就只有这

HDU 1251 统计难题 (字典树)(查询是否为前缀)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 37626    Accepted Submission(s): 13858 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

HDU 1671 (字典树统计是否有前缀)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671 Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers: 1. Emergenc