这一场打的又很差,我是fw,C想不出来。

A题

题意:给你一个字符串,问你有没有办法往里添一个'a',使得它不是一个回文串。

思路:显然只有整个字符串全是'a'才无解,否则对字符串进行扫描,对称位置不是'a'的地方放'a'即可。
代码如下

char s[N];
 
int main()
{
	IOS;
	int T;
	cin >> T;
	while(T --)
	{
		cin >> s;
		int len = strlen(s);
		bool flag = false;
		for(int i = 0 ; i < len ; i ++)
			if(s[i] != 'a') flag = true;
		int d;
		if(!flag) cout << "NO\n";
		else
		{
			cout << "YES\n";
			int d;
			for(int i = 0 ; i < len ; i ++)
				if(s[len - i - 1] != 'a')
				{
					d = i;
					break;
				}
			for(int i = 0 ; i < len ; i ++)
			{
				if(i == d) cout << 'a';
				cout << s[i]; 
			}
			cout << "\n";
		}
	}	
	
	return 0;
}

B题

题意:给你一个01初始序列和目标序列,每次可以选择前 \(2*x\)个位置异或1(前提是选择区域的0和1个数相等),问你有没有办法变成目标序列。

思路:直接找到最长的需要变换的地方,l[i],r[i]分别表示0~i中0和1的个数,每操作一次,都应该使得要操作的区间长度减小,模拟这个过程即可。
代码如下

char s[N];
char mb[N];
int l[N], r[N];
 
int main()
{
	IOS;
	int T;
	cin >> T;
	while(T --)
	{
		int n;
		cin >> n;
		cin >> s; 
		cin >> mb;
		if(s[0] == '0') l[0] ++;
		else r[0] ++;
		for(int i = 1 ; i < n ; i ++)
		{
			l[i] = l[i - 1];
			r[i] = r[i - 1];
			if(s[i] == '0') l[i] ++;
			else r[i] ++;
		}
		int len = -1;
		for(int i = 0 ; i < n ; i ++)
			if(s[i] != mb[i])	len = i;
		
		bool flag = true;
		int time = 1;
		while(len >= 0)
		{
			int pre = len;
			if(l[len] != r[len])
			{
				flag = false;
				break;
			}
			if(time & 1)
				for( ; len >= 0 && s[len] != mb[len] ; len --);
			else 
				for( ; len >= 0 && s[len] == mb[len] ; len --);
			time ++;
		}
		if(flag) cout << "YES\n";
		else cout << "NO\n";
		for(int i = 0 ; i < n ; i ++)	l[i] = r[i] = 0; 
	}	
	
	return 0;
}

C题

题意:给你一个01序列,问你能不能构造两个合法的括号序列a,b,使得当\(s[i] = 1时,a[i] = b[i], 当s[i] = 0时,a[i] \neq b[i]\)。

思路:首先,两个括号序列的开头一定是'(',结尾一定是')',其次,由于两个左右括号之和都是n,而n是偶数,因此01序列中0的个数必须是偶数。必须满足上述条件才有解,然后构造序列的方式为,先双指针扫描左右两端的'1',左边放左括号,右边放右括号,然后从头开始扫描0,轮流放左右括号,另一个序列反之即可。
代码如下

int n;
char s[N];
char ans[N];
 
 
int main()
{
	IOS;
	int T;
	cin >> T;
	while(T --)
	{
		cin >> n;
		cin >> s + 1;
		bool flag = true;
		int cnt = 0;
		if(s[1] != '1' || s[n] != '1') flag = false;
		for(int i = 2 ; i < n ; i ++)
			if(s[i] == '0') cnt ++;
		
		if(cnt & 1) flag = false;
		if(!flag) cout << "NO\n";
		else
		{
			cout << "YES\n";
			int l = 1, r = n;
			while(l < r)
			{
				while(s[l] != '1') l ++;
				while(s[r] != '1') r --;
				if(l >= r) break;
				ans[l ++] = '(', ans[r --] = ')';				
			}
			int cnt = 0;
			for(int i = 1 ; i <= n ; i ++)
				if(s[i] == '0')
				{
					cnt ++;
					if(cnt & 1) ans[i] = '(';
					else ans[i] = ')';
				}
			for(int i = 1 ; i <= n ; i ++)	cout << ans[i];
			cout << "\n";
			
			cnt = 0;
			for(int i = 1 ; i <= n ; i ++)
				if(s[i] == '0')
				{
					cnt ++;
					if(cnt & 1) ans[i] = ')';
					else ans[i] = '(';
				}
			for(int i = 1 ; i <= n ; i ++)	cout << ans[i];
			cout << "\n";	
		}
	}	
	
	return 0;
}