字典树p8036

news/2025/1/11 11:12:45/

Description

给定 �n 个模式串 �1,�2,…,��s1​,s2​,…,sn​ 和 �q 次询问,每次询问给定一个文本串 ��ti​,请回答 �1∼��s1​∼sn​ 中有多少个字符串 ��sj​ 满足 ��ti​ 是 ��sj​ 的前缀

一个字符串 �t 是 �s 的前缀当且仅当从 �s 的末尾删去若干个(可以为 0 个)连续的字符后与 �t 相同。

输入的字符串大小敏感。例如,字符串 Fusu 和字符串 fusu 不同。

Input

本题单测试点内有多组测试数据

输入的第一行是一个整数,表示数据组数 �T。

对于每组数据,格式如下:
第一行是两个整数,分别表示模式串的个数 �n 和询问的个数 �q。
接下来 �n 行,每行一个字符串,表示一个模式串。
接下来 �q 行,每行一个字符串,表示一次询问。

Output

按照输入的顺序依次输出各测试数据的答案。
对于每次询问,输出一行一个整数表示答案。

Sample 1

InputcopyOutputcopy
3
3 3
fusufusu
fusu
anguei
fusu
anguei
kkksc
5 2
fusu
Fusu
AFakeFusu
afakefusu
fusuisnotfake
Fusu
fusu
1 1
998244353
9
2
1
0
1
2
1

Hint

数据规模与约定

对于全部的测试点,保证 1≤�,�,�≤1051≤T,n,q≤105,且输入字符串的总长度不超过 3×1063×106。输入的字符串只含大小写字母和数字,且不含空串。

说明

std 的 IO 使用的是关闭同步后的 cin/cout,本题不卡常。

#include<bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int tr[N][100];
int idx=0;
int cnt[N];
int change(char x){
    if(x<='z'&&x>='a')return x-'a';
    else if(x<='Z'&&x>='A')return x-'A'+26;
    else return x-'0'+52;
}
void insert(string b){
    int u=0;
    for(int i=0;i<b.size();i++){
        int j=change(b[i]);
        if(!tr[u][j]){
            idx++;
            tr[u][j]=idx;
            
        }
    
        u=tr[u][j];
        cnt[u]++;
    }
}

int search(string b){
    int u=0;
    for(int i=0;b[i];i++){//b[i] == i<b.size()
        int j=change(b[i]);
        if(!tr[u][j]){
            return 0;
        }
        u=tr[u][j];
    }
    return cnt[u];
}
void sol(){
    for(int i=0;i<=idx;i++){
        memset(tr[i],0,sizeof(tr[i]));
        cnt[i]=0;
    }
    idx=0;
    int n,q;cin>>n>>q;    
    string a;
    while(n--){
        cin>>a;
        insert(a);
    } 
    while(q--){
        cin>>a;
        cout<<search(a)<<endl;
    }
}
int main(){
    int t;cin>>t;
    while(t--)sol();
    return 0;
}


http://www.ppmy.cn/news/47173.html

相关文章

NetSuite GPT的辅助编程实践

作为GPT综合症的一种表现&#xff0c;我们今朝来探究下GPT会不会抢了我们SuiteScript的编程饭碗&#xff0c;以及如何与之相处。以下内容来自我个人的实践总结。 我们假设一个功能场景&#xff1a; 为了让用户能够在报价单上实现“一键多行”功能&#xff0c;也就是在报价中可…

learn_C_deep_1 (C程序补充知识、变量的声明和定义、声明和定义的区别)

目录 C程序补充知识 变量的声明和定义 1.什么是变量&#xff1f; 2.变量的本质是什么&#xff1f; - 所有的变量都要在内存的某个位置开辟空间 3.变量的定义和声明形式、初始化和赋值的区别 4.为什么要定义变量 声明和定义的区别 C程序补充知识 先让我们来看一段C语言…

.net学习教程大纲

以下是一个 .NET 学习指南大纲&#xff0c;供您参考&#xff1a; 一、C# 编程语言 语言基础知识 数据类型、变量、常量 运算符、表达式 流程控制语句 数组、集合和泛型 类、对象、封装、继承和多态 接口和委托 异常处理 LINQ 面向对象设计原则 二、.NET 框架 .NET…

激活函数(Activation Function)及十大常见激活函数

目录 1 激活函数的概念和作用 1.1 激活函数的概念 1.2 激活函数的作用 1.3 通俗地理解一下激活函数&#xff08;图文结合&#xff09; 1.3.1 无激活函数的神经网络 1.3.2 带激活函数的神经网络 2 神经网络梯度消失与梯度爆炸 2.1 简介梯度消失与梯度爆炸 2.2 梯度不稳…

2021遥感应用组二等奖:基于机器学习回归算法的鄱阳湖水质遥感定量反演及时序变化监测研究

作品介绍 一、作品背景 鄱阳湖是中国第一大淡水湖&#xff0c;也是中国第二大湖&#xff0c;它在调节长江水位、涵养水源、改善当地气候等方面起着重大的作用。但近年来受围垦、环境污染等人类活动影响&#xff0c;鄱阳湖湿地退化严重&#xff0c;同时使鄱阳湖的容量减少&…

新能源汽车的充电、电池包的组成、充电的设备

一、新能源汽车的电池包 1、电动汽车电池包的组成 电动汽车的电池包主要由电池单体、模组构成。 电池单体指的是单个独立的锂电池&#xff0c;将多个电池单体组合在一起就成了模组&#xff0c;再把多个模组组合起来最终构成电池包。 不过这里有个特例&#xff0c;那就是比亚…

java面向对象

一、面向对象和面向过程 1、面向对象思想和面向过程思想 面向过程 关注的焦点是过程&#xff1a;过程就是操作数据的步骤。如果某个过程的实现代码重复出现&#xff0c;那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码&#xff0c;便于维护。 典型的语言&a…

从零开始学架构——高性能负载均衡

高性能负载均衡 单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单——通过增加更多的服务器来提升系…