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";
    }
}
相关推荐
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
XH华4 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_4 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子5 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡5 小时前
滑动窗口 + 算法复习
数据结构·算法
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码5 小时前
Cmd命令大全(万字详细版)
python·算法·小程序