You are given n strings s1, s2, ..., sn consisting of characters 0 and 1. m operations are performed, on each of them you concatenate two existing strings into a new one. On the i-th operation the concatenation saisbi is saved into a new string sn + i (the operations are numbered starting from 1). After each operation you need to find the maximum positive integer k such that all possible strings consisting of 0 and 1 of length k (there are 2k such strings) are substrings of the new string. If there is no such k, print 0.

Input

The first line contains single integer n (1 ≤ n ≤ 100) — the number of strings. The next n lines contain strings s1, s2, ..., sn (1 ≤ |si| ≤ 100), one per line. The total length of strings is not greater than 100.

The next line contains single integer m (1 ≤ m ≤ 100) — the number of operations. m lines follow, each of them contains two integers aiabd bi (1 ≤ ai, bi ≤ n + i - 1) — the number of strings that are concatenated to form sn + i.

Output

Print m lines, each should contain one integer — the answer to the question after the corresponding operation.

Example
input
5
01
10
101
11111
0
3
1 2
6 5
4 4
output
1
2
0
Note

On the first operation, a new string "0110" is created. For k = 1 the two possible binary strings of length k are "0" and "1", they are substrings of the new string. For k = 2 and greater there exist strings of length k that do not appear in this string (for k = 2 such string is "00"). So the answer is 1.

On the second operation the string "01100" is created. Now all strings of length k = 2 are present.

On the third operation the string "1111111111" is created. There is no zero, so the answer is 0.


  题目大意 有n个01字符串,第i个操作是生成第n + i个字符串,方式是将两个已经存在的字符串拼接到一起,然后询问最大的k使得所有长度为k的01串都在这个串中出现过。

  范围很吓人,意味着最大可能你需要判断2100个串是否存在(和同学组队开黑的时候被吓坏了。。懵逼了好久。),然而事实上。。答案都非常小。至少我没有找到一个超过10的。

  另外注意到是拼接,所以串内部的情况不变,唯一增加新出现的子串的地方是拼接处,因为已经知道答案很小,就直接暴力就好了。

  另外注意一个细节,就是用位运算弄得时候记得在开头加一个1,不然它会认为01和001是同一个串,但是101中并不存在串001。

  (个人认为这道题的难点就在于估计答案范围,猜到很小就乱搞就好了,方法很多,什么记忆化搜索+二分也可以)

  下面是答案会比较小的证明:(感谢我的学长idy002)

  考虑长度为k的01串,在两个串进行合并的时候,两个串内部包含的本质不同的串是不变的,所以不会增加。因此新增加的子串一定是跨过交界处。

  所以最多有(k - 1)个新增的本质不同的01串。再加上原本的包含为k的本质不同的01串的个数,可以列得不等式:

  解不等式得到k不会超过11。

Code

 /**
* Codeforces
* Problem#868D
* Accepted
* Time: 30ms
* Memory: 1700k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; #define limlen 15 typedef class String {
public:
string pre, suf;
boolean overflow;
int rt;
bitset<> mark; String():overflow(false) { }
}String; String operator + (String& a, String& b) {
String rt;
rt.overflow = a.overflow || b.overflow;
rt.mark = a.mark | b.mark;
if(!a.overflow) {
rt.pre = a.pre + b.pre;
if(rt.pre.length() > limlen)
rt.overflow = true, rt.pre.resize(limlen);
} else rt.pre = a.pre;
if(!b.overflow) {
rt.suf = a.suf + b.suf;
if(rt.suf.length() > limlen)
rt.overflow = true, rt.suf = rt.suf.substr(rt.suf.size() - limlen, rt.suf.size());
} else rt.suf = b.suf; string s = a.suf + b.pre;
for(int i = ; i < s.length(); i++)
for(int j = , t = ; j < limlen && i + j < s.length(); j++) {
t = (t << ) | (s[i + j] & );
rt.mark[t | ( << (j + ))] = ;
} int i;
for(rt.rt = ; ; rt.rt++) {
for(i = ; i < ( << rt.rt + ) && rt.mark[i | ( << rt.rt + )]; i++);
if(!rt.mark[i | ( << rt.rt + )])
break;
}
return rt;
} int n, m;
String strs[]; inline void init() {
cin >> n;
for(int i = ; i <= n; i++) {
cin >> strs[i].pre;
strs[i].suf = strs[i].pre;
strs[i].mark[] = ;
for(int j = ; j < strs[i].pre.length(); j++)
for(int k = , t = ; k < limlen && j + k < strs[i].pre.length(); k++) {
t = (t << ) | (strs[i].pre[j + k] & );
strs[i].mark[t | ( << (k + ))] = ;
}
}
} inline void solve() {
cin >> m;
for(int i = , a, b; i <= m; i++) {
cin >> a >> b;
strs[n + i] = strs[a] + strs[b];
cout << strs[n + i].rt << endl;
}
} int main() {
ios::sync_with_stdio(false), cin.tie(), cout.tie();
init();
solve();
return ;
}

Codeforces 868D Huge Strings - 位运算 - 暴力的更多相关文章

  1. [Codeforces Round #438][Codeforces 868D. Huge Strings]

    题目链接:868D - Huge Strings 题目大意:有\(n\)个字符串,\(m\)次操作,每次操作把两个字符串拼在一起,并询问这个新串的价值.定义一个新串的价值\(k\)为:最大的\(k\) ...

  2. codeforces - 15C Industrial Nim(位运算+尼姆博弈)

    C. Industrial Nim time limit per test 2 seconds memory limit per test 64 megabytes input standard in ...

  3. Codeforces 878A - Short Program(位运算)

    原题链接:http://codeforces.com/problemset/problem/878/A 题意:给出n个位运算操作, 化简这些操作, 使化简后的操作次数不多于5步. 思路:我们可以对二进 ...

  4. Codeforces 868C Qualification Rounds - 位运算

    Snark and Philip are preparing the problemset for the upcoming pre-qualification round for semi-quar ...

  5. POJ1753 Flip Game(位运算+暴力枚举)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  6. CodeForces - 1230D(思维+位运算)

    题意 https://vjudge.net/problem/CodeForces-1230D 要组建一个小组,要求小组中每个人都不比所有人强,当一个人懂得一个算法但是另一个不懂那么前者认为他比后者强. ...

  7. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  8. Vus the Cossack and Strings(Codeforces Round #571 (Div. 2))(大佬的位运算实在是太强了!)

    C. Vus the Cossack and Strings Vus the Cossack has two binary strings, that is, strings that consist ...

  9. CodeForces 282C(位运算)

    C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

随机推荐

  1. cocos2dx JS 清除缓存重新编译打包安卓apk

    复制他人工程时打包出错,无法进行.或者是资源缓存问题需要重新编译删除 proj.android 工程下的三个文件夹 frameworks -> runtime-src -> proj.an ...

  2. cocos2dx 3.13 在Mac平台下配置安卓环境变量

    终端下输入:vi .bash_profile 编辑环境变量: export COCOS_CONSOLE_ROOT=/Users/jiazedong/Cocos2d-x/cocos2d-x-3.2/co ...

  3. uml的几种关系总结

    UML类图几种关系的总结    在UML类图中,常见的有以下几种关系:泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregati ...

  4. ****************VS编码操作实践******************

    下面是今天主要练习的内容: 运用到的内容有 {运算符.强制转换.数据类型的运用.转义字符.变量与常量.基本类型的转换等} 1) 首先我们来看  下列的编码是由三大类组成的 ① 定制变量与常量  蓝色部 ...

  5. Unity shader学习之Alpha Test的阴影

    Alpha Test的阴影, shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClip ...

  6. django admim后台不转义提交的html

    autoescape¶ Controls the current auto-escaping behavior. This tag takes either on or off as an argum ...

  7. IIS7配置rewriter

    遇到的问题就是rewriter不起效果冲IIS6迁移过来的.最后发现是Framework 4.0的原因!记录处理方式为: 一. <configSections> <section n ...

  8. Spring Cloud 服务的注册与发现(Eureka)

    Eureka服务注册中心 一.Eureka Server Eureka Server是服务的注册中心,这是分布式服务的基础,我们看看这一部分如何搭建. 首先,Spring Cloud是基于Spring ...

  9. skynet对Windows环境支持的版本:Windows版skynet

    https://github.com/sanikoyes/skynet.git Skynet Skynet is a lightweight online game framework, and it ...

  10. IO多路复用 IO异步

    一.概念说明 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的环境给出的答案是不同的.所以先限定一下本文的环境.本文讨论的背景是Linux环境下的network I ...