A题,遍历每个位置,找到在这个位置对称的位置是否为’a’,如果不是那么把’a’插在这个位置
#include<bits/stdc++.h>
using namespace std;
int t,n;
int main()
{
scanf("%d",&t);
while(t--)
{
string s;
cin>>s;
n=s.size();
int p=-1;
for(int i=0;i<n;i++)
{
if(s[n-1-i]!='a')
{
p=i;
break;
}
}
if(p==-1)
{
puts("NO");
continue;
}
puts("YES");
for(int i=0;i<p;i++)cout<<s[i];
cout<<'a';
for(int i=p;i<n;i++)cout<<s[i];
puts("");
}
return 0;
}
B题,预处理 s 1 s1 s1串的 01 01 01数量差,用 s u m sum sum存下,在从后往前遍历,若2个串在这个位置不同,那么把 s 1 s1 s1串翻转,用f来存翻转次数,翻转2次等于没翻
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
int t,n,m,a[N];
int sum[N];
int main()
{
scanf("%d",&t);
while(t--)
{
string s1,s2;
scanf("%d",&n);
cin>>s1>>s2;
s1=' '+s1;
s2=' '+s2;
for(int i=1;i<=n;i++)
{
if(s1[i]=='1')sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1]-1;
}
bool f=0,ff=0;
for(int i=n;i>=1;i--)
{
if(!f)
{
if(s1[i]!=s2[i])
{
if(!sum[i])f=1;
else
{
ff=1;
break;
}
}
}
else
{
if(s1[i]==s2[i])
{
if(!sum[i])f=0;
else
{
ff=1;
break;
}
}
}
}
if(ff)puts("NO");
else puts("YES");
}
return 0;
}
C题,简单的构造题,首先要知道首尾不能出现0且0的个数为偶数,然后前面一半的1为’(’,后面一半的1为’)’,然后一对0中第一个0为‘(’,第二个0为’)’
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int tt,n;
string s;
char t[N];
int main()
{
scanf("%d",&tt);
while(tt--)
{
scanf("%d",&n);
cin>>s;
if(s[0]=='0'||s[n-1]=='0')
{
puts("NO");
continue;
}
int cnt=0;
for(int i=0;i<n;i++)if(s[i]=='1')cnt++;
if(cnt&1)
{
puts("NO");
continue;
}
puts("YES");
int c=0,c1=0;
for(int i=0;i<n;i++)
{
if(s[i]=='1')
{
c++;
if(c<=cnt/2)printf("("),t[i]='(';
else printf(")"),t[i]=')';
}
else
{
if(c1)c1=0,printf(")"),t[i]=')';
else c1=1,printf("("),t[i]='(';
}
}
puts("");
for(int i=0;i<n;i++)
{
if(s[i]=='1')printf("%c",t[i]);
else if(t[i]=='(')printf(")");
else printf("(");
}
puts("");
}
return 0;
}