题意

问题描述

万能的红太阳J 君正在研究量子信息的纠缠。

具体来说,J 君有一个初始为空的信息集。她会进行m 次操作,有时,她会向信息集内加入一个长度不超过L 的的数字串(一个数字串为一个仅由0 到9 组成的非空字符串),有时她会给出一个数字串,询问这个数字串是否包含在她的信息集中,有时她会选取两个长度不超过L 的数字串,使她们在信息集内互相纠缠。

两个数字串A 和B 互相纠缠代表,对于信息集中的任意串A+C,需满足B +C 也在信息集中,对于信息集中的任意串B + D,需满足A + D 也在信息集中(其中+ 代表字符串顺序连接,C;D 可能是空串),因此一次纠缠操作可能导致若干个数字串(可能为无穷多个) 被加入信息集中。

由于两个数字串的纠缠是一种状态,在纠缠后的任何时刻都需满足以上性质,因此第一次纠缠操作之后的任何添加操作都可能导致大于1 个(可能为无穷多个) 数字串被加入信息集。

你需要做的就是回答J 君的所有询问。

输入格式

第一行包含一个正整数m,代表操作数。

接下来m 行,每行可能有以下形式:

1 s 代表将数字串s 加入信息集中

2 s 代表询问数字串s 是否在信息集中

3 a b 代表使数字串a 和b 互相纠缠

输出格式

对于每一个2 操作,如果询问串不在集合中,请输出一行一个整数0,否则输出一行一个整数1。

样例输入

11

1 123

2 123

2 0

3 12 13

1 124

2 133

2 134

2 13

3 1 11

2 111

2 11111111111111111111111124

样例输出

1

0

1

1

0

0

1

数据规模与约定

100% 的数据满足\(m \leq 10^5, c \leq 2050, S \leq 8 \times 10^6,L \leq 50, P \equiv m \mod 10\)。

其中c 代表1 操作与3 操作次数之和,S 代表询问字符串的总长度。

分析

首先考虑没有3 操作的情况,我们很容易想到使用一个字典树维护这个集合。

接下来考虑3 操作,对于每个3 操作,我们只需要递归合并上述字典树上的两个节点即可。

时间复杂度\(O(c^2L + S)\)

这时间复杂度我也不知道是怎么回事。

代码

#define yuki(x, y) for(int i = x, __yuki__ = y; i < __yuki__; ++i)
#define yukj(x, y) for(int j = x, __yukj__ = y; j < __yukj__; ++j)
#define yukii(x, y) for(int i = x, __yukii__ = y; i <= __yukii__; ++i)
#define yukji(x, y) for(int j = x, __yukji__ = y; j <= __yukji__; ++j)
#define yuk(x, y, z) for(int x = y, __yui__ = z; x < __yui__; ++x)
#define yui(x, y, z) for(int x = y, __yuk__ = z; x >= __yuk__; --x)
#define sclr(x) memset(x, 0, sizeof(x))
#define sclr1(x) memset(x, -1, sizeof(x))
#define scl(x, y) memset(x, y, sizeof(x))
#define ft first
#define sc second
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cassert>
using namespace std;
typedef long long lol;
const int maxp = 1000100;
int n, m, alc, refl[1000100], fre[1000100], trans[1000100][10], root;
char buf[8000100];
bool mk[1000100];
int gf(int x)
{
return refl[x] == x ? x : (refl[x] = gf(refl[x]));
}
void init()
{
yuki(1, maxp) refl[i] = i;
root = ++alc;
}
void insert(char *ch)
{
int cur = root;
while(*ch)
{
int x = *ch++-'0';
if(!trans[cur][x]) trans[cur][x] = ++alc;
cur = gf(trans[cur][x]);
}
mk[cur] = true;
}
bool ask(char *ch)
{
int cur = root;
while(*ch)
{
int x = *ch++-'0';
if(!trans[cur][x]) return false;
cur = gf(trans[cur][x]);
}
return mk[cur];
}
int &getnode(char *s)
{
int cur = root;
int l = strlen(s);
yuki(0, l-1)
{
int x = s[i]-'0';
if(!trans[cur][x]) trans[cur][x] = ++alc;
cur = gf(trans[cur][x]);
}
return trans[cur][s[l-1]-'0'];
}
void merge(int &a, int &b, bool flag) // 类似线段树启发式合并
{
a = gf(a);
int y = gf(b); // 不用重新定义y
if(!a && !y)
{
if(flag) a = b = ++alc; // 都没有要补上,为了以后的修改
return;
}
else if(a == y) // 已经相同就不用补了
return;
if(!a) // 单空返回
{
a = y;
return;
}
else if(!b)
{
b = a;
return;
}
refl[y] = a; // 合并子树的标记
if(mk[y]) mk[a] = true; // 合并单词的存在性
yuki(0, 10)
{
merge(trans[a][i], trans[y][i], false);
a = gf(a); // 后代可能会对祖先取并
}
}
void cond()
{
int &a = getnode(buf);
scanf("%s", buf);
int &b = getnode(buf);
merge(a, b, true);
}
int main(int argc, char **argv)
{
freopen("quantum.in", "r", stdin);
freopen("quantum.out", "w", stdout);
init();
scanf("%d", &n);
int t;
while(n--)
{
scanf("%d%s", &t, buf);
if(t == 1)
insert(buf);
else if(t == 2)
puts(ask(buf) ? "1" : "0");
else
cond();
}
return 0;
}

test20180921 量子纠缠的更多相关文章

  1. 预见未来丨机器学习:未来十年研究热点 量子机器学习(Quantum ML) 量子计算机利用量子相干和量子纠缠等效应来处理信息

    微软研究院AI头条 https://mp.weixin.qq.com/s/SAz5eiSOLhsdz7nlSJ1xdA 预见未来丨机器学习:未来十年研究热点 机器学习组 微软研究院AI头条 昨天 编者 ...

  2. 量子纠缠2——CHSH不等式

    问题 有Alice和Bob两个人,随机给他们两个数x和y(0或1),然后A和B根据他们得到数(x和y)给两个个数a和b(0或1). 规则如下: 如果输入的x和y都是1,那么,Alice和Bob给出不一 ...

  3. 量子纠缠1——量子比特、Bell态、EPR佯谬

    量子纠缠是量子物理的基本性质,他描述的是:当几个粒子相互作用后,无法单独描述各个粒子的性质,只能整体描述,本文主要介绍两个量子比特之间的纠缠. 量子比特(Qubit) 量子比特是量子计算的基本单位,就 ...

  4. JZOJ5822 【NOIP提高A组模拟2018.8.16】 量子纠缠

    这是一道很巧妙的题目. 今早,我调了好久,终于将它切掉了-- 题目 Description Input 第一行包含一个正整数 m,代表操作数. 接下来 m 行,每行可能有以下形式: 1 s 代表将数字 ...

  5. 量子隐形传态1 Quantum Teleportation

    量子隐形传态是量子纠缠的又一个应用. 隐形传态,所谓隐形的意思就是没有物质介质就传递了信息,在经典世界,传递信息要有介质,光.电磁波或者其他的什么,但是在量子的世界里,我可以把信息传递给你,并且不传递 ...

  6. 在 Visual Studio 中使用 Q# 进行量子编程

    1 量子计算机与量子编程 1.1 量子计算机 Quantum computing is computing using quantum-mechanical phenomena, such as su ...

  7. Python魔法函数与两比特量子系统模拟

    技术背景 本文主要涵盖两个领域的知识点:python的魔法函数和量子计算模拟,我们可以通过一个实际的案例来先审视一下这两个需求是如何被结合起来的. 量子计算模拟背景 ProjectQ是一个非常优雅的开 ...

  8. 用量子计算模拟器ProjectQ生成随机数,并用pytest进行单元测试与覆盖率测试

    技术背景 本文中主要包含有三个领域的知识点:随机数的应用.量子计算模拟产生随机数与基于pytest框架的单元测试与覆盖率测试,这里先简单分别介绍一下背景知识. 随机数的应用 在上一篇介绍量子态模拟采样 ...

  9. 量子:基于ERP块对的两步量子直接通信

    学习论文: 题目:Two-step quantum direct communication protocol using the Einstein-Podolsky-Rosen pair block ...

随机推荐

  1. Netty优雅退出机制和原理

    1.进程的优雅退出 1.1.Kill -9 PID带来的问题 在Linux上通常会通过kill -9 pid的方式强制将某个进程杀掉,这种方式简单高效,因此很多程序的停止脚本经常会选择使用kill - ...

  2. spring boot 2.0 + 静态资源被拦截,怎么办?

    问题描述:使用springboot 2.0后,按照springboot 1.5版本(以下简称旧版)的方式去配置项目.结果发现静态资源访问不到了,本文对此情况分析.处理 项目结构: 直接上图 如果是在旧 ...

  3. delphi文件名获取方法

    取文件名 ExtractFileName(FileName); 取文件扩展名: ExtractFileExt(filename); 取文件名,不带扩展名: 方法一:   Function Extrac ...

  4. Android设计模式之单例模式

    定义 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 . 单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一 ...

  5. Prime Gift CodeForces - 912E (中途相遇)

    链接 大意:求素因子只含给定素数的第k大数 先二分答案转为判定x是第几大, 然后分两块合并即可, 按奇偶分块可以优化一下常数 #include <iostream> #include &l ...

  6. ubuntu 用户和root权限转换

    1,用户权限要转换为root 输入:sudo su   或者sudo -i  然后按照提示输入相应的密码你就可以转化为root用户了. 2,root权限切换成用户权限 输入:su  如果是服务器那就输 ...

  7. UVA-12113 Overlapping Squares (回溯+暴力)

    题目大意:问能不能用不超过6张2x2的方纸在4x4的方格中摆出给定的图形? 题目分析:暴力枚举出P(9,6)种(最坏情况)方案即可. 代码如下: # include<iostream> # ...

  8. 双机热备(准)-->RAC(夭折)-->DG(异地容灾)

    以下有的地方为oracle专业术语,非懂勿喷.前段时间某项目负责人告知,他们应用需要一套oracle数据库环境运行模式为双机热备.简单了解下对于现在已经非常成熟的RAC再合适不过了.详细问了问当前服务 ...

  9. (C#基础)Linq学习理解

    一遍学习基础,一遍练习打字,很多乐趣. 代码 using System; using System.Collections.Generic; using System.Linq; using Syst ...

  10. poj1088 滑雪 解题报告

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 77423   Accepted: 28779 Description ...