“科大讯飞杯”第18届上海大学程序设计联赛春季赛暨高校网络友谊赛(C~D)
作者:互联网
C 最长非公共子序列
题意:这一题可能咋一看比较难懂它在讲什么,大概讲的是,两个序列,求它们最长非公共子序列。那么什么是“非公共”呢?题目是这样解释的:
-
c 是 s1 的子序列但不是 s2 的子序列;
-
c 是 s2 的子序列但不是 s1 的子序列。
题解:仔细看一下这样只有两种情况:一种是两个序列相等,这样就不存在了;另一种是两个序列不相等,这样我们只需要输出两种之中最长的长度就可以了。
代码:
#include<iostream> #include<cstring> #include<algorithm> #define ll long long using namespace std; int main(){ string s1,s2; cin>>s1>>s2; if(s1==s2){ cout<<-1<<endl; }else{ cout<<max(s1.length(),s2.length())<<endl; } return 0; }
D 最大字符集
题意:这一题的题意也比较简单,就是让你输出最大长度的为n的字符串且满足一下条件:
-
每个字符串由 0 和 1 组成。
-
每个字符串长度在 1 到 n 之间,且两两长度不同。
-
集合中任何一个字符串都不是其他字符串的子串。
求满足以上条件的最大集合。
题解:这一题是一个构造,有点像cf中的a,b题的味道,你只要特判n=1和n=2两种情况,其余的按照第一个和末尾的一个是1,中间的是0输出即可。
代码:
#include<iostream> #include<cstring> using namespace std; int main(){ int n; cin>>n; if(n==1){ cout<<1<<endl; cout<<1<<endl; }else if(n==2){ cout<<2<<endl; cout<<0<<endl; cout<<11<<endl; }else{//最大长度至少为 3 int len=2; cout<<n-1<<endl; for(int j=0;j<n-1;j++){ for(int r=0;r<len;r++){ if(r==0||r==len-1){ cout<<0; }else{ cout<<1; } } cout<<endl; len++; } } return 0; }
标签:题意,s2,s1,18,字符串,飞杯,序列,友谊赛,include 来源: https://www.cnblogs.com/blogxsc/p/12764749.html