题目传送门

sol1:用bitset来维护,其实感觉挺暴力的,不怎么会用bitset,借着这道题学习一下。

  • bitset暴力维护

    #include "bits/stdc++.h"
    #define debug puts("what the fuck");
    using namespace std;
    const int MAXN = ;
    char s[MAXN];
    bitset<> bs[][MAXN];
    int main() {
    int n, m, q;
    scanf("%d%d", &n, &m);
    for (int i = ; i <= n; i++) {
    scanf("%s", s + );
    for (int j = ; s[j]; j++)
    bs[s[j] ^ ''][j][i] = ;
    }
    scanf("%d", &q);
    for (int i = ; i <= q; i++) {
    scanf("%s", s + );
    bitset<> res;
    res.set();
    for (int j = ; s[j]; j++) {
    if (s[j] == '_') continue;
    res &= bs[s[j] ^ ''][j];
    }
    printf("%d\n", res.count());
    }
    return ;
    }

sol2:一开始做这题,看到能有多少个匹配上的字符串联想到的是字典树,但是不断优化还是超时。然后跟一位网友学到了开两颗字典树然后匹配的方法。

  • 字典树

    #include "bits/stdc++.h"
    using namespace std;
    #define debug puts("what the fuck");
    typedef long long LL;
    typedef pair<int, int> PII;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + ;
    const int MAXNODE = 3e6 + ;
    const int MAXN = ;
    int cnt[MAXNODE], ans[MAXNODE];
    int res[MAXN];
    vector<int> q[MAXNODE];
    struct Trie {
    int son[MAXNODE][];
    int tot;
    void insert(char* s, int v, int op) {
    // puts(s);
    int p = ;
    for (int i = ; s[i]; i++) {
    int id = (s[i] == '_') ? : s[i] ^ '';
    if (!son[p][id]) son[p][id] = ++tot;
    p = son[p][id];
    // printf("\t%d %c", p, s[i]);
    }
    // puts("");
    if (op == ) cnt[p] += v;
    else q[p].push_back(v);
    }
    } t1, t2;
    char s[MAXN];
    void merge(int p1, int p2, int p, int m) {
    if (p == m) {
    ans[p2] += cnt[p1];
    // printf("\t %d %d\n", p1, p2);
    return;
    }
    if (t2.son[p2][] && t1.son[p1][]) merge(t1.son[p1][], t2.son[p2][], p + , m);
    if (t2.son[p2][] && t1.son[p1][]) merge(t1.son[p1][], t2.son[p2][], p + , m);
    if (t2.son[p2][]) {
    if (t1.son[p1][]) merge(t1.son[p1][], t2.son[p2][], p + , m);
    if (t1.son[p1][]) merge(t1.son[p1][], t2.son[p2][], p + , m);
    }
    }
    int main() {
    int n, m, qq;
    scanf("%d%d", &n, &m);
    for (int i = ; i <= n; i++) {
    scanf("%s", s);
    t1.insert(s, , );
    }
    scanf("%d", &qq);
    for (int i = ; i <= qq; i++) {
    scanf("%s", s);
    t2.insert(s, i, );
    }
    merge(, , , m);
    for (int i = ; i <= t2.tot; i++) {
    for (auto index : q[i]) {
    res[index] = ans[i];
    }
    }
    for (int i = ; i <= qq; i++)
    printf("%d\n", res[i]);
    return ;
    }

    代码妙在离线后的匹配最多只要把两颗字典树都跑一边,复杂度应该是两颗字典树的节点数。网上看到另一种字典树写法分类讨论,如果询问中'_'的 个数小于20就用暴力,感觉在卡数据,不过比赛的时候这种投机的方法也未尝不可。

牛客-富豪凯匹配串(bitset)的更多相关文章

  1. 牛客练习赛53 (C 富豪凯匹配串) bitset

    没想到直接拿 bitset 能过 $10^8$~ code: #include <bits/stdc++.h> #define N 1004 #define setIO(s) freope ...

  2. 牛客练习赛53 C 富豪凯匹配串

    思路: bitset的简单题,不幸的是当时的我并不知道bitset, C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间, ...

  3. 牛客练习赛53 C题bitset

    题目链接https://ac.nowcoder.com/acm/contest/1114/C #include<bits/stdc++.h> using namespace std; #d ...

  4. 牛客练习赛53 A-E

    牛客联系赛53 A-E 题目链接:Link A 超越学姐爱字符串 题意: 长度为N的字符串,只能有C,Y字符,且字符串中不能连续出现 C. 思路: 其实就是DP,\(Dp[i][c]\) 表示长度为 ...

  5. 牛客小白月赛13 小A的回文串(Manacher)

    链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个 ...

  6. 牛客网剑指Offer——正则表达式匹配

    1. 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整 ...

  7. 牛客寒假算法基础集训营4 I Applese 的回文串

    链接:https://ac.nowcoder.com/acm/contest/330/I来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串. ...

  8. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  9. 好串_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

随机推荐

  1. wepy 小程序定时器(验证码倒计时) 数据绑定页面无刷新

    每次改变数据的时候记得调用  this.$apply() 验证码倒计时 使用的vant-weapp  UI组件 wxml: <van-col span="10" style= ...

  2. 《打造扛得住的MySQL数据库架构》第3章 MySQL基准测试

    3-1 什么是基准测试 测量系统性能,优化是否有效?MySQL基准测试. 定义:基准测试是一种测量和评估软件性能指标的活动,用于建立某个时刻的性能基准,以便当系统发生软硬件 变化时重新进行基准测试以评 ...

  3. 布局基础<kotlin>(整理自网络)

    全屏 主界面 底部导航,bottombar 添加依赖 implementation 'com.roughike:bottom-bar:2.3.1' 主界面布局 <com.roughike.bot ...

  4. js根据当前日期 求一个月前 半年前 一年前的日期

    function p(s) {        return s < 10 ? '0' + s: s;}getlastmonth() function getlastmonth() {    va ...

  5. Python笔记_第四篇_高阶编程_检测_1.对函数进行单元检测

    1. 对函数进行单元检测: 单元检测: 作用:用来对一个函数.一个类.一个模块进行正确性校验工作. 结果: * 单元测试通过,说明我们测试函数的功能正确. * 单元测试不通过,说明函数有BUG,要么测 ...

  6. Oracle数据库中表的imp&exp

    在Oracle数据库中可以使用imp和exp命令来执行数据的导入导出(包括表结构和数据),使用imp和exp命令执行导入导出操作必需的是需要安装Oracle数据库,系统安装Oracle数据库,可以识别 ...

  7. 最大子矩阵和(二维矩阵转一维DP)

    题目描述 蒜头君拿到了一个矩阵,他想知道其中的最大非空子矩阵和是多少. 输入格式 第一行输入两个整数 n,m代表这个矩阵的行数和列数.接下来n行,每行m个整数 ai1,ai2,ai3⋯aim.(1≤m ...

  8. sklearn.metrics中的评估方法介绍(accuracy_score, recall_score, roc_curve, roc_auc_score, confusion_matrix)

    1 accuracy_score:分类准确率分数是指所有分类正确的百分比.分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型.常常误导初学 ...

  9. Centos8无法安装screen的解决方法:使用epel安装screen

    选择了一个基础款的vps安装的镜像选了熟悉的centos的最新版centos8,但是在安装screen的时候,却安装不了,提示: No match for argument: screen 本来以为是 ...

  10. one_day_one_linuxCmd---scp命令

    <坚持每天学习一个 linux 命令,今天我们来学习 scp 命令> scp 命令主要用在不同的 linux 系统之间 copy 文件,基于 ssh 登录,是一种安全的复制 scp 命令的 ...