Codeforces 868D Huge Strings - 位运算 - 暴力
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.
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.
Print m lines, each should contain one integer — the answer to the question after the corresponding operation.
5
01
10
101
11111
0
3
1 2
6 5
4 4
1
2
0
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 - 位运算 - 暴力的更多相关文章
- [Codeforces Round #438][Codeforces 868D. Huge Strings]
题目链接:868D - Huge Strings 题目大意:有\(n\)个字符串,\(m\)次操作,每次操作把两个字符串拼在一起,并询问这个新串的价值.定义一个新串的价值\(k\)为:最大的\(k\) ...
- codeforces - 15C Industrial Nim(位运算+尼姆博弈)
C. Industrial Nim time limit per test 2 seconds memory limit per test 64 megabytes input standard in ...
- Codeforces 878A - Short Program(位运算)
原题链接:http://codeforces.com/problemset/problem/878/A 题意:给出n个位运算操作, 化简这些操作, 使化简后的操作次数不多于5步. 思路:我们可以对二进 ...
- Codeforces 868C Qualification Rounds - 位运算
Snark and Philip are preparing the problemset for the upcoming pre-qualification round for semi-quar ...
- POJ1753 Flip Game(位运算+暴力枚举)
Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...
- CodeForces - 1230D(思维+位运算)
题意 https://vjudge.net/problem/CodeForces-1230D 要组建一个小组,要求小组中每个人都不比所有人强,当一个人懂得一个算法但是另一个不懂那么前者认为他比后者强. ...
- 【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)
这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...
- 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 ...
- CodeForces 282C(位运算)
C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
随机推荐
- 前端获取的数据是undefined
var id = $("id1").val(); var username = $("username1").val(); var password = $(& ...
- phpstudy一系列安装问题
phpStudy是一款PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...
- c#之课后习题
1.折叠代码 #region 折叠内容#endregion 2.保留三位小数 using System; namespace _005_double保留3位小数 { class Program { s ...
- C# 去重处理字符大小写
本文展示了如何对集合去重并且处理大小写
- <2>Cocos Creator文件结构
1.文件结构 当新建HelloWorld项目后会自动出现以下文件夹结构 ProjectName(项目文件夹名称) |------assets |------library |------local | ...
- POJ1944 Fiber Communications (USACO 2002 February)
Fiber Communications 总时间限制: 1000ms 内存限制: 65536kB 描述 Farmer John wants to connect his N (1 <= N ...
- linux 命令杂集
[1]查找日志中某个字符串XXXX tail -f 日志文件名 | grep "XXXX" [2]linux抓包命令 tcpdump -i XXX -A ip xxx.xx ...
- C++11 Function 使用场景
[1]场景分析 在一个函数内部,可能会多次用到某一段代码,一般情况是把这段用到次数较多的代码封装成一个函数. 但是,如果这段代码仅仅只在这个函数中有使用,这时封装成函数显得既麻烦又冗赘. 那么,有没有 ...
- Qt信号之自定义数据类型
[1]为什么需要自定义数据类型? 内置类型毕竟很有局限性,否则为什么还需要类呢.总之,有时候,我们多么希望信号能发送自定义数据类型. 幸哉~ Qt是支持自定义信号,且自定义信号可以发送自定义数据类型的 ...
- Java重排序
重排序数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个 ...