「字典树」[TJOI2010]阅读理解

[TJOJ2010]阅读理解

原题链接:[TJOJ2010]阅读理解

题目大意

给你很多个字符串,再给你单个字符串,问后面单个字符串是否在前面多个字符串中出现过

题目题解

很简单..不用我多说 2 3分钟写完

但是!我交了20多遍,为什么?

TM它卡bool(草

这道题让我理解了什么叫\(bitset\),以后就不用bool了 quq

//#define fre yes

#include <bitset>
#include <cstdio>
#include <cstring>

const int N = 600010;
struct Node {
    int son[26];
} trie[N];
std::bitset<1001> b[500007];

int tnt;
void trieInsert(char c[], int k) {
    int len = strlen(c + 1);
    int rt = 0;
    for (int i = 1; i <= len; i++) {
        int id = c[i] - 'a';
        if(!trie[rt].son[id]) trie[rt].son[id] = ++tnt;
        rt = trie[rt].son[id];
    } b[rt][k] = 1;

}

int n;
void trieFind(char c[]) {
    int len = strlen(c + 1);
    int flag = 1, rt = 0;
    for (int i = 1; i <= len; i++) {
        int id = c[i] - 'a';
        if(!trie[rt].son[id]) {
            flag = 0;
            break;
        } rt = trie[rt].son[id];
    } if(flag) {
        for (int i = 1; i <= n; i++) {
            if(b[rt][i]) {
                printf("%d ", i);
            }
        }
    } puts("");
}

char c[10000];
int main() {
    static int m;
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        int x;
        scanf("%d", &x);
        for (int j = 1; j <= x; j++) {
            scanf("%s", c + 1);
            trieInsert(c, i);
        }
    }

    scanf("%d", &m);
    for (int i = 1; i <= m; i++) {
        scanf("%s", c + 1);
        trieFind(c);
    } return 0;
}

原文地址:https://www.cnblogs.com/Nicoppa/p/11509862.html

时间: 2024-07-31 14:33:37

「字典树」[TJOI2010]阅读理解的相关文章

「CF484E」Sign on Fence「整体二分」「线段树」

题意 给定一个长度为\(n\)的正整数序列,第\(i\)个数为\(h_i\),\(m\)个询问,每次询问\((l, r, w)\),为\([l, r]\)所有长度为\(w\)的子区间最小值的最大值.(类似于一类特殊的直方图最大子矩形问题) \(1 \leq n, m \leq 10^5\) 题解 我们考虑二分答案,这样\(n\)个数变成\(01\),若\(h_i\geq mid\)则为\(0\),否则为\(1\) 每次就相当于查询存不存在长度为\(w\)的连续\(1\).用线段树维护. 这有个问

「线段树」[AHOI2009]维护序列

双倍经验,还是蓝题,岂不美哉 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为\(a_1,a_2,-,a_N\) .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入格式 第一行两个整数\(N\)和\(P\)\((1≤P≤1000000000)\). 第二行含有\(N\)个非负整数,从左到右依次为\(a_1,a_2,-,

「POI 2005」SZA-Template 「失配树」「双向链表」「思维」

先来观察答案的几个强性质. 首先答案肯定是原串的一个\(\tt{border}\),也就是失配树上的一条链. 再进一步观察:比如说答案在原串出现的位置分别为\(p_1, p_2, p_3... p_k\)(不妨设其严格升序),那么一定有\(\max (p_i - p_{i-1}) \leq length(ans)\). 你问我为什么?如果大于的话就接不上了啊... 然后我们发现,只要满足上面那两个条件,那这个串一定就是个合法串.于是我们把这套东西搬到失配树上: 这个串是n在树上的祖先 这个串在树

LGOJ3879 TJOI2010 阅读理解

不可否认,\(TJOI\)的这道题确实不难 为本题写博客的唯一原因就是 \(STL\)大法好!!!! Description link 不简述题意了,因为实在是简单 Solution 直接\(map<string,vector<int> > mp\),后面的\(vector\)统计答案就完事了 码量小,思维难度小,何乐不为? Code #include <bits/stdc++.h> using namespace std; #define int long long

关于异或_字典树的一些性质

异或的性质 1. a ⊕ a = 0 2. a ⊕ b = b ⊕ a 3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c; 4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c. 5. a ⊕ b ⊕ a = b.     自反性 6.若x是二进制数0101,y是二进制数1011: 则x⊕y=1110 只有在两个比较的位不同时其结果是1,否则结果为0 即"两个输入相同时为0,不同则为1"! 字典树:又称为Trie,是一种用于快速检索的多叉

【字典树】统计难题

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束.Output对于每个提问,给出以该字符串为前缀的单词的数量.Samp

[Luogu 3701] 「伪模板」主席树

[Luogu 3701] 「伪模板」主席树 <题目链接> 这是一道网络流,不是主席树,不是什么数据结构,而是网络流. 题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝. S 向 byx 的树中的每一个人连有向边,手气君的树中的每一个人向 T 连有向边,边权为这个人的寿命.统计同一棵树中的膜法师数量 x.如果一个人是主席,那么边权要加上 x.(续得好啊) 然后,如果 byx 树中的一个点 i 能赢手气君树中的点 j,那么连 i->j,边权为 1. 跑最大

「不会」矩阵树定理

定理不会证,也不会用 「小z的房间」 暴力建图 「重建」 矩阵树求的是$\sum\limits_{T} \prod\limits_{e\in T} w(e)$ 而要求的是$\sum\limits_{T} \prod\limits_{e\in T}p(e)*\prod\limits_{e isnot\in T} 1-p(e)$ 即$\prod\limits_e 1-p(e) \sum\limits_{T} \prod\limits_{e\in T}p(e)/(1-p(e))$ 设$w(e)=p(e

《iOS「通告机制」及由其引出的对「架构模式」、「设计模式」的理解

说明:为了区别「本地通知」与「推送通知」这两种iOS中提醒用户,可见的「通知」,本文所将Notification翻译为「通告」.它们的详细区别,可参考<iOS开发系列--通知与消息机制>一文. 实践遇到的问题: 最近在维护公司的一个项目中,遇到这样一个报错:-[GlobalManager addAlbum:]: unrecognized selector sent to instance 经排查,原因如下:以前同事在利用「通告机制」在GlobalManager类中把「自己/self」注册为「观