P3879 [TJOI2010] 阅读理解- 字典树

题面

分析

将所有单词存入字典树,重点值怎么判断在哪一行出现过,对于字典树查询的判断字符串是否存在的数组可以开成二维,也就是在查询到某个字符串存在后,再通过循环判断每一层是否存在。

代码
cpp 复制代码
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int N = 5e5 + 10;

int son[N][30];
bitset<1010> vis[N];
int idx;
int n;

void insert(string s, int i) {
    int p = 0;
    for(int i = 0; i < s.size(); i ++) {
        int c = s[i] - 'a';
        if(!son[p][c]) son[p][c] = ++ idx;
        p = son[p][c];
    }
    vis[p][i] = 1;
}

vector<int> query(string s) {
    int p = 0;
    vector<int> ans;
    for(int i = 0; i < s.size(); i ++) {
        int c = s[i] - 'a';
        if(!son[p][c]) return ans;
        p = son[p][c];
    }
    for(int i = 1; i <= n; i ++) {
        if(vis[p][i]) ans.push_back(i);
    }
    return ans;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    for(int i = 1; i <= n; i ++) {
        int l;
        cin >> l;
        for(int j = 0; j < l; j ++) {
            string s;
            cin >> s;
            insert(s, i);
        }
    }
    int m;
    cin >> m;
    while(m --) {
        string s;
        cin >> s;
        vector<int> ans = query(s);
        for(int i = 0; i < ans.size(); i ++) cout << ans[i] << ' ';
        cout << "\n";
    }
}
相关推荐
绛洞花主敏明8 小时前
Go切片的赋值
c++·算法·golang
10001hours10 小时前
初阶数据结构.1.顺序表.通讯录项目(只有源码和注释)
数据结构·算法
Emilia486.11 小时前
八大排序算法
算法·排序算法
blammmp12 小时前
算法专题十九:记忆化搜索(暴搜->记忆化搜索)
算法·深度优先·记忆化搜索
纵有疾風起12 小时前
C++—string(1):string类的学习与使用
开发语言·c++·经验分享·学习·开源·1024程序员节
MicroTech202512 小时前
边缘智能的创新:MLGO微算法科技推出基于QoS感知的边缘大模型自适应拆分推理编排技术
科技·算法·ai
王哈哈^_^14 小时前
【数据集】【YOLO】目标检测游泳数据集 4481 张,溺水数据集,YOLO河道、海滩游泳识别算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·分类·视觉检测
巴里巴气14 小时前
第73题 矩阵置零
线性代数·算法·矩阵
voice67015 小时前
密码学实验二
算法·密码学·哈希算法
Blossom.11816 小时前
把AI“编”进草垫:1KB决策树让宠物垫自己报「如厕记录」
java·人工智能·python·算法·决策树·机器学习·宠物