LCS自动机求调

#include <bits/stdc++.h>
using namespace std;
int main(){
  int ab,bc,ca;
  cin>>ab>>bc>>ca;
  for(int i=1;i<=50;i++){
    cout<<0;
  }
  cout<<endl;
  int p=max(0,bc-min(ab,ca));
  for(int i=1;i<=ab;i++){
    cout<<0;
  }
  for(int i=1;i<=p;i++){
    cout<<1;
  }
  cout<<endl;
  for(int i=1;i<=ca;i++){
    cout<<0;
  }
  for(int i=1;i<=p;i++){
    cout<<1;
  }
}

题目描述:
一个字符串的子序列可以通过删除这个字符串的若干个字符得到,两个字符串的最长公共子序列是这两个字符串所有的公共子序列中最长的一个,比如lcs(“101”,“111000”)=2,f(“101”,“11011”)=3,f(“00”,“1111”)=0,给你三个正整数,ab,bc,ca,请找出三个字符串A,B,C满足以下条件

  • 每一个字符串只包含0或者1

  • 每个字符串的长度是1到1000

  • lcs(A, B) = ab, lcs(B, C) = bc, lcs(C, A) = ca

求满足条件的任意一组A,B,C

输入格式:
输入一行包含三个整数ab,bc,ca, (
1

a
b
,
b
c
,
c
a

50
1≤ ab,bc,ca≤50)

输出格式:
输出三行包含三个字符串,分别代表A,B,C

样例输入1:
2 3 4

样例输出1:
1111
101
1010101

样例输入2:
4 4 7

样例输出2:
10101010
1011
1010101

样例输入3:
6 7 8

样例输出3:
10101010
1111010
110101010

子任务一30分:1<=max(ab,bc,ca) <=10

子任务二30分:1<=max(ab,bc,ca) <=20

子任务三40分:1<=max(ab,bc,ca) <=50

提示:

1 个赞

怎么可能这么简单(?)

错误数据:
8 7 8

1 个赞


image

就类似这个

所以到底怎么写?。

1 个赞

不保证 ab<bc<ca

所以判断一下三个数的大小关系?

1 个赞

111

同时输出还要处理一下,你要不嫌码量大的话直接讨论所有情况,反正才 6 种()

炸了,根本调不出来,先去写T3了

1 个赞

ab不一定是最小的,你可以把ab换成最小的,再换回去,分类讨论也行

#include <bits/stdc++.h>
using namespace std;
char a[55],b[55],c[55];
int main(){
  int ab,bc,ca;
  cin>>ab>>bc>>ca;
  if(ab>=bc&&ab>=ca){//ca,bc<=ab
    for(int i=0;i<ab;i++){
      c[i]='1';
    }
    for(int i=0;i<ca;i++){
      a[i]='1';
    }
    for(int i=ca;i<ca+ab-min(bc,ca);i++){
      a[i]='0';
    }
    for(int i=0;i<bc;i++){
      b[i]='1';
    }
    for(int i=bc;i<bc+ab-min(bc,ca);i++){
      b[i]='0';
    }
  }else if(bc>=ab&&bc>=ca){
    for(int i=0;i<bc;i++){
      a[i]='1';
    }
    for(int i=0;i<ab;i++){
      b[i]='1';
    }
    for(int i=ab;i<ab+bc-min(ab,ca);i++){
      b[i]='0';
    }
    for(int i=0;i<ca;i++){
      c[i]='1';
    }
    for(int i=ca;i<ca+bc-min(ab,ca);i++){
      c[i]='0';
    }
  }else{
    for(int i=0;i<ca;i++){
      b[i]='1';
    }
    for(int i=0;i<ab;i++){
      a[i]='1';
    }
    for(int i=ab;i<ab+ca-min(ab,bc);i++){
      a[i]='0';
    }
    for(int i=0;i<bc;i++){
      c[i]='1';
    }
    for(int i=bc;i<bc+ca-min(ab,bc);i++){
      c[i]='0';
    }
  }
  cout<<a<<endl<<b<<endl<<c;
}

60pts,我没有看的次数了!cao!

@stringdp100005 @我命由我不由天 @360病毒 @金圣哲

1 个赞

谁来解决一下。。。

1 个赞

AC了,字符串开小了

1 个赞

此话题已在最后回复的 15 天后被自动关闭。不再允许新回复。