前言

简介:涉及字典树 (Trie),题目源于洛谷
建议大家先自行尝试解题,同时阿鑫的水平不高,所以题解也通常并不算好,建议大家可以在洛谷相关题目的题解处查看其他大佬的题解,阿鑫的题解简单看看就好。

详细了解可至链接:OI-wiki 字典树 (Trie)


模板题

洛谷P8306 【模板】字典树

题目链接: P8306 【模板】字典树

【模板】字典树
题目描述
给定 $n$ 个模式串 $s_1, s_2, \dots, s_n$ 和 $q$ 次询问,每次询问给定一个文本串 $t_i$,请回答 $s_1 \sim s_n$ 中有多少个字符串 $s_j$ 满足 $t_i$ 是 $s_j$ 的前缀。 一个字符串 $t$ 是 $s$ 的前缀当且仅当从 $s$ 的末尾删去若干个(可以为 0 个)连续的字符后与 $t$ 相同。
输入的字符串大小敏感。例如,字符串 Fusu 和字符串 fusu 不同。
输入格式
本题单测试点内有多组测试数据
输入的第一行是一个整数,表示数据组数 $T$。
对于每组数据,格式如下:
第一行是两个整数,分别表示模式串的个数 $n$ 和询问的个数 $q$。
接下来 $n$ 行,每行一个字符串,表示一个模式串。
接下来 $q$ 行,每行一个字符串,表示一次询问。
输出格式
按照输入的顺序依次输出各测试数据的答案。
对于每次询问,输出一行一个整数表示答案。
样例 1
样例输入 1

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

提示
数据规模与约定
对于全部的测试点,保证 $1 \leq T, n, q\leq 10^5$,且输入字符串的总长度不超过 $3 \times 10^6$。输入的字符串只含大小写字母和数字,且不含空串。
说明
std 的 IO 使用的是关闭同步后的 cin/cout,本题不卡常。

解题思路:

ac题解

#include <bits/stdc++.h>
using namespace std;

int T,n,q;
int cnt,tri[3000005][63],ed[3000005]; //字典树变量 

//字符转化成对应下标 
int GetNum(char c){
    if(c>='0'&&c<='9') return c-'0';
    else if(c>='A'&&c<='Z') return c-'A'+10;
    else return c-'a'+36;
}

//初始化字典树 
void Init(){
    for(int i=0;i<=cnt;i++){
        ed[i]=0;
        for(int j=0;j<63;j++){
            tri[i][j]=0;    
        }
    }
    cnt=0;
}

//字典树插入 
void TrieInsert(string &s){
    int i,t,idx=0;
    for(i=0;i<s.length();i++){
        t=GetNum(s[i]);
        if(!tri[idx][t]) tri[idx][t]=++cnt;            
        idx=tri[idx][t];
        ed[idx]++;
    }
}

//字典树查询前缀出现次数 
void TrieFind(string &s){
    int i,t,idx=0,ans=0;
    for(i=0;i<s.length();i++){
        t=GetNum(s[i]);
        if(!tri[idx][t]) break;
        idx=tri[idx][t];
    }
    if(i==s.length()) ans=ed[idx];
    printf("%d\n",ans);
}

int main()
{
    cin>>T;
    string s;
    while(T--){
        scanf("%d%d",&n,&q);
        Init();
        while(n--){
            cin>>s;
            TrieInsert(s);
        }
        while(q--){
            cin>>s;
            TrieFind(s);
        }
    }
    return 0;    
}
Copyright © 阿鑫 2022 all right reserved,powered by Gitbook最初发布时间: 2022-02-13

results matching ""

    No results matching ""