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

Posted nicoppa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「字典树」[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;

以上是关于「字典树」[TJOI2010]阅读理解的主要内容,如果未能解决你的问题,请参考以下文章

P3879 [TJOI2010]阅读理解(Trie)

LGOJ3879 TJOI2010 阅读理解

bzoj4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

luoguP3871 [TJOI2010]中位数

P1377 [TJOI2011]树的序:离线nlogn建二叉搜索树

BZOJ 1212 L语言(DP+字典树)