A、Common Subsequence
水题,找两个数组中有没有相同的字符就可以了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
int a[N],b[N],pd[N];
int main()
{
int t,n,m,k,l=0,r=0;
cin >> t;
while(t--){
cin >> n >> m;
memset(pd,0,sizeof pd);
int ans = -1;
for(int i=0;i<n;i++)
{
cin >> a[i];
pd[a[i]] = 1;
}
for(int i=0;i<m;i++)
{
cin >> b[i];
if(pd[b[i]]==1)
ans = b[i];
}
if(ans!=-1)
cout << "YES" <<endl << 1 << " " << ans <<endl;
else
cout << "NO" <<endl;
}
return 0;
}
B、Sequential Nim
博弈。
其实就是按照顺序从第一个堆开始取,可以一次取多个但只能在一个堆取,如果谁第一个遇见一个大于等于2的堆谁就获胜,先遇见的可以决定另外一个人的操作,如果大于2它可以一直拿到这个堆只有一个,让另一个人拿这一个,他就掌握到了主动权。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
ll a[N],b[N],pd[N];
int main()
{
int t,n;
cin >> t;
while(t--){
cin >> n;
int i;
for(i=0;i<n;i++)
cin >> a[i];
for(i=0;i<n;i++)
if(a[i]>1)
break;
if(i!=n)
i++;
if(i%2==0)
cout << "Second" <<endl;
else
cout << "First" <<endl;
}
return 0;
}
C2(C1)、Prefix Flip
题意:给你两个字符串a,b,问怎么操作能使a变成b。操作:可以使字符串的一段前缀逆反(1变成0,0变成1)然后整体反转。
思路:先把a串和b串变为单一串(即全是0或者全是1),然后把变的过程记录一下,a过程顺序b过程逆序输出即可。
看了大佬的思路,没想到还能这么想……
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+10;
//ll a[N],b[N],pd[N];
int n;
char a[N],b[N];
vector<int>ans1,ans2;
void solve(char s[],vector<int> &ans)
{
for(int i=1;i<=n-1;i++)
{
if(s[i]!=s[i+1])
ans.push_back(i);
}
if(s[n]=='1')
ans.push_back(n);
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> a+1 >> b+1; // a,b下标从1开始
ans1.clear();
ans2.clear();
solve(a,ans1); // 注意传参是a,不是a+1
solve(b,ans2);
int sz1=ans1.size();
int sz2=ans2.size();
cout << sz1+sz2;
for(int i=0;i<sz1;i++)
cout << " " << ans1[i];
for(int i=sz2-1;i>=0;i--) // 倒序输出
cout << " " << ans2[i];
cout <<endl;
}
return 0;
}