牛客-富豪凯匹配串(bitset)
题目传送门
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)的更多相关文章
- 牛客练习赛53 (C 富豪凯匹配串) bitset
没想到直接拿 bitset 能过 $10^8$~ code: #include <bits/stdc++.h> #define N 1004 #define setIO(s) freope ...
- 牛客练习赛53 C 富豪凯匹配串
思路: bitset的简单题,不幸的是当时的我并不知道bitset, C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间, ...
- 牛客练习赛53 C题bitset
题目链接https://ac.nowcoder.com/acm/contest/1114/C #include<bits/stdc++.h> using namespace std; #d ...
- 牛客练习赛53 A-E
牛客联系赛53 A-E 题目链接:Link A 超越学姐爱字符串 题意: 长度为N的字符串,只能有C,Y字符,且字符串中不能连续出现 C. 思路: 其实就是DP,\(Dp[i][c]\) 表示长度为 ...
- 牛客小白月赛13 小A的回文串(Manacher)
链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个 ...
- 牛客网剑指Offer——正则表达式匹配
1. 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整 ...
- 牛客寒假算法基础集训营4 I Applese 的回文串
链接:https://ac.nowcoder.com/acm/contest/330/I来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串. ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- 好串_via牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28537/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
随机推荐
- nginx反向代理和负载均衡的实现
反向代理和负载均衡的关系可以理解为,一个ip的负载均衡就是反向代理. 反向代理使用的是:proxy_pass指令 负载均衡使用的是:proxy_pass指令+upstream指令 负载均衡的3中方 ...
- 正则表达式模式修正符 比如/esi
正则表达式模式修正符 比如/esi 作者: 字体:[增加 减小] 类型:转载 下面列出了当前在 PCRE 中可能使用的修正符.括号中是这些修正符的内部 PCRE 名.修正符中的空格和换行被忽略,其它字 ...
- JAVA 创建文件和文件夹,删除文件和文件夹的实用工具
package com.file; import java.io.File; import java.io.IOException; //创建新文件和目录 public class CCRDFile ...
- vi粘贴代码后格式混乱的问题
最近在远程终端使用vi发现从其他地方复制代码的后,粘贴到vi里面出现格式变乱的问题. 主要是因为终端通常无法区分输入是来自用户输入还是来自粘贴,所以终端也不能通知 vim 输入来自何处.在 vim 里 ...
- h5-伪元素-before和after
做一个门票或者邮票:效果图 1.html就是两个div 2.具体css代码 <style> /*左侧长方体基本样式*/ div:nth-of-type(1){ width: 300px; ...
- linux.linuxidc.com - /2011年资料/Android入门教程/
本文转自 http://itindex.net/detail/15843-linux.linuxidc.com-%E8%B5%84%E6%96%99-android Shared by Yuan 用户 ...
- php开启opcache
OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销. 一.php.ini配置opchche ...
- unity学习 5.x解包
using System.Collections;using System.Collections.Generic;using UnityEngine; public class bundleload ...
- 垃圾windows10更新遇到的问题
缘由 1.win10现在必须更新,不更新不给你用,关闭自动更新的方法都失效了,如果有人知道有效的方法还请私信指教一下.. 一个延迟几天的笨方法:当出现更新并关机或更新并重启时,把电源键设置成关机. 就 ...
- 在CentOS7上从源码编译安装redis,并做成服务程序
1.安装编译的依赖环境 # 安装pcre开发包: yum install -y pcre-devel # 安装ssl功能需要openssl库 yum -y install openssl-devel ...