题解:AT_arc211_b

· · 题解

思路

我们让 S_1 长度为 Y。因为很明显再长的话没有任何作用了。

然后我们把 S_1S_3 的第 X+1Z 全部写 1,最后在 S_3 后面插入 Z0,此时就做完了。

举个例子,输入 5 12 12 时输出为:

000001111111
000000000000
000001111111000000000000

需要注意的是我们把第 (X+1)Z 全部写 1,是为了防止影响到 S_1S_2 最长公共子串的长度,如输入仍为 5 12 12 时,输出的 S_1S_2 可能变为

000001000000
000000000000

注意到此时最长公共子串的长度是 6 了。

于是你很开心地提交,获得了许多 WA。

注意到 X=Y 时,我们可以构造三个全 0 的字符串即可。

代码实现

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a, b, c;
int t1[1005], t2[1005], t3[1005];
int main() {
    scanf("%d%d%d", &a, &b, &c);
    if(a == b) {
        printf("%d ", a);
        for(int i = 1; i <= a; ++i) printf("0 ");
        printf("\n%d ", c);
        for(int i = 1; i <= c; ++i) printf("0 ");
        printf("\n%d ", c);
        for(int i = 1; i <= c; ++i) printf("0 ");
        return 0;
    }
    for(int i = a + 1; i <= c; ++i)
        t1[i] = t3[i] = 1;
    // t2[a + 1] = 0;
    printf("%d ", b);
    for(int i = 1; i <= b; ++i) printf("%d ", t1[i]);
    printf("\n%d ", c);
    for(int i = 1; i <= c; ++i) printf("%d ", 0);
    printf("\n%d ", c * 2);
    for(int i = 1; i <= c * 2; ++i) printf("%d ", t3[i]);
}