前言

先是这位神仙写了这道题 \(O(n\log n)\) 的做法。然后去他的博客上恰了一波。

然后发现这道题有 \(O(n)\) 的做法的。其实也不难。

题目

题目链接:https://www.luogu.com.cn/problem/P3500

分别判断多个序列是否是另外一个序列删除若干个数字之后得到的。

思路

考虑暴力。对于每一个询问,我们都维护两个指针,分别扫描原串 \(a\) 和询问的串 \(b\)。如果 \(a[i]=b[j]\),那么两个指针都往后扫,否则仅 \(a\) 的指针往后扫即可。

时间复杂度 \(O(nm)\)。

容易发现,其实没必要对于每一个询问的串都扫描一次 \(a\),我们其实可以只扫描一次 \(a\),对于 \(a\) 的每一位,分别去匹配每一个 \(b\) 即可。

具体一点,设一个串 \(b_i\) 的前 \(x\) 位都被扫完并比配了,我们就需要在 \(a\) 串中找到下一个 \(b_i[x+1]\) 的位置。

扫描 \(a\) 串,设现在扫描到第 \(i\) 位,\(b_i\) 串已经匹配完前 \(num_i\) 个位置了。那么所有 \(a_i=b_j[num_j]\) 的 \(b_j\) 第 \(num_j\) 位就匹配上了,对于这些 \(b_j\),我们将 \(num_j\) 加一即可。

如何求出扫描到第 \(i\) 位时有哪些 \(b\) 串满足正好需要匹配 \(a_i\) 呢?用 \(\operatorname{vector}\) 即可。设 \(pos[x]\) 表示现在需要匹配数字 \(x\) 的 \(b\) 串有哪些,对于 \(a_i=k\),我们将 \(pos[k]\) 里面的 \(b\) 全部往下匹配一个位置即可。

时间复杂度 \(O(n)\)。具体一点 \(O(n+\sum^{m}_{i=1}len[i])\)。其中 \(len[i]\) 表示第 \(i\) 个 \(b\) 串的长度。

代码

#include <cstdio>
#include <vector>
#include <cctype>
#include <cstring>
#include <algorithm>
#define mp make_pair
using namespace std; const int N=1000010;
int n,m,len,a[N],b[N],st[N];
bool ans[N];
vector<pair<int,int> > pos[N],cpy; int read()
{
int d=0,f=1; char ch=getchar();
while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar();
while (isdigit(ch)) d=(d<<1)+(d<<3)+ch-48,ch=getchar();
return f*d;
} int main()
{
n=read();
for (int i=1;i<=n;i++)
a[i]=read();
m=read();
for (int i=1,x;i<=m;i++)
{
x=read(); st[i]=len+1;
for (int j=1;j<=x;j++)
b[++len]=read();
pos[b[st[i]]].push_back(mp(i,st[i]));
}
st[m+1]=len+1;
for (int i=1;i<=n;i++)
{
cpy.clear();
for (int j=0;j<pos[a[i]].size();j++)
{
int k=pos[a[i]][j].first,p=pos[a[i]][j].second;
if (p+1==st[k+1]) ans[k]=1;
else cpy.push_back(mp(k,p+1));
}
pos[a[i]].clear();
for (int j=0;j<cpy.size();j++)
{
int k=cpy[j].first,p=cpy[j].second;
pos[b[p]].push_back(mp(k,p));
}
}
for (int i=1;i<=m;i++)
if (ans[i]) printf("TAK\n");
else printf("NIE\n");
return 0;
}

【洛谷P3500】TES-Intelligence Test的更多相关文章

  1. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  2. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  3. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  4. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  5. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  6. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  7. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  8. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

  9. 洛谷 P1379 八数码难题 Label:判重&&bfs

    特别声明:紫书上抄来的代码,详见P198 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给 ...

随机推荐

  1. Ubuntu安装程序报错:无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)

    问题描述:在使用Ubuntu系统时安装程序时出现下面的报错. E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)E: Unable to ...

  2. C++雾中风景番外篇4:GCC升级二三事

    最近将手头上负责的项目代码从GCC 4.8.2升级到了GCC 8.2.(终于可以使用C++17了,想想后续的开发也是很美好啊~~)不过这个过程之中也遇到了一些稀奇古怪的问题,在这里做一个简单的记录,希 ...

  3. bugku 多种方法解决

    首先打开链接发现是一个exe文件 实在是想不出办法了 只能回去看提示 说会有一张图片 不知道怎么就打开了hxd 然后拖进去 发现了一串 用图片base64加密的码 然后在网页中找到 解码 工具 htt ...

  4. pytorch数学运算与统计属性入门(非常易懂)

    pytorch数学运算与统计属性入门1.Broadcasting (维度)自动扩展,具有以下两个重要特征:(1)expand (2)without copying data重点的核心实现功能是:(1) ...

  5. [蓝桥杯][基础训练]Huffuman树

    Description Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. , p1, …, pn-1},用这列数构造Huffman树的过程如下:1. 找到{pi} ...

  6. P1558 色板游戏 线段树(区间修改,区间查询)

    题意: 给n,m,k,n长度,k个操作,m种颜色 操作C:输入A,B,C,区间[A,B]变成C颜色,可能A>B,所以要确保A<B 操作P:输入A,B,区间[A,B]的颜色种类 思路: 因为 ...

  7. Java - Test - TestNG: Idea 引入 testng.xml 自动生成插件

    1. 概述 Idea 引入自动生成 testng.xml 插件 自动生成 testng.xml 2. 背景 testng 调试 调试 testng, 主要是这两种方法 ide 下直接执行测试 方法 类 ...

  8. 查询数据操作:limit

    1.作用: 在查看数据时用于限制获得的记录数量,一般放在最后. 2.语法: limit offset,row_count; 解析: offset:偏移量,索引值默认从0开始,可以省略 row_coun ...

  9. 喵星之旅-狂奔的兔子-centos7安装MySQL 5.5

    安装环境:https://www.cnblogs.com/kittybunny/p/12296078.html 一.下载安装文件 下载地址 https://downloads.mysql.com/ar ...

  10. STM32CUBEMX使用操作记录

    1.New Project 2.选择芯片型号 3.配置相关外设 4.例如选择了GPIO_Output 5.配置时钟树 灰色框点不了,这和你上一步相关外设配置有关,鼠标靠近灰色框,系统会给出提示 6.工 ...