您的位置:首页 > 其它

codeforces contest 868 problem D(玄学)

2017-10-06 17:17 357 查看
D. Huge Strings

time limit per test
2 seconds

memory limit per test
256 megabytes

input
standard input

output
standard output

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
ai abd
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.

题意:求一个只包含0/1的字符串中 的最大的k ,k所有 2^k个01集合
解:这种一看题目就感觉不能做的题目 竟然用模拟就能水过。。。
玄学操作:当字符串的长度超过1000时只取首尾各500各字符,大神说这是概率。。。(总结 :大力出奇迹 暴力小范围xjb莽一发 可能可以水过)
正解是分治:http://blog.csdn.net/sinat_35406909/article/details/78162440

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
string str[210];
int ans[210];
int solve(int k)
{
for(int i=10; i>=1; i--)
{
int flag=0;
for(int h=0; h<(1<<i); h++)
{
string s="";
for(int j=0; j<i; j++)
{
if(h&(1<<j)) s+="1";
else s+="0";
}
if(str[k].find(s)==str[k].npos)
{
flag=1;
break;
}
}
if(!flag) return i;
}
return 0;
}

int main()
{
int n, m;
memset(ans,0,sizeof(ans));
scanf("%d", &n);
for(int i=1; i<=n; i++) cin>>str[i];
scanf("%d", &m);
for(int i=n+1; i<=n+m; i++)
{
int x, y;
scanf("%d %d", &x, &y);
str[i]=str[x]+str[y];
if(str[i].length()>1000)
str[i]=str[i].substr(0,500)+str[i].substr(str[i].length()-500,500);
ans[i]=max(solve(i),max(ans[x],ans[y]));
printf("%d\n",ans[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: