Codeforces Round #712 (Div. 2)

A. Déjà Vu

题意:有n个字符串,有一次操作在字符串任意位置填一个字符‘a’,求是否能构成一个非回文串,如果不能则输出NO能则输出添加一个’a’之后形成的非回文串。
思路:不难想到如果全是由字符a构成的字符串是NO,其他都有对应解,然后加在首尾的两种情况肯定是顶多只有一种会构成回文串,特判一下就好=。=判断的时候脑子短了。

#include<bits/stdc++.h>
using namespace std;
int  main ()
{
    
    
	int n,i,j,t;
	string s1;
	cin>>t;
	while(t--){
    
    
		cin>>s1;
		int f=0;
		for(i=0;i<s1.length();i++){
    
    
			if(s1[i]!='a')
				f=1;
		}
		if(f==0){
    
    
			cout<<"NO"<<endl;
		}
		else {
    
    
			cout<<"YES"<<endl;
			string s2;
			int d1=0;
			while(1){
    
    
				for(i=0;i<s1.length();i++){
    
    
					if(i==d1) s2+='a';
					s2+=s1[i];
				}
				string s3=s2;
				reverse(s2.begin(),s2.end());
				if(s3!=s2){
    
    
					cout<<s3<<endl;
					break;
				}
				d1=s1.length()-1;
				s2="";
			}
		}
	}
}

B. Flip the Bits

题意:给你两个字符串a、b,可以修改无限次,每次修改可以使得前缀的0和1相同的字符串的0变成1,1变成0。
思路:直接模拟就好,不会t,因为能操作的时候一定是0和1相同的时候,如果操作完会生成两种字符串,一种是反转一种是原串,如果其中有一种串能和答案串匹配那么就继续,然后指针从下一位开始。
总结:哎,又被这么简单的题卡了那么久= =,下次一定从b开始就仔细读题,由于上场没读明白被卡了一晚上x,这次猛冲完发现只能改前缀并且0和1相同。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	std::ios::sync_with_stdio(false);
    cin.tie(NULL);
	string s1,s2;
	int n,i,j,t;
	cin>>t;
	while(t--){
    
    
		cin>>n>>s1>>s2;
		int m1=0,c0=0,c1=0,flag=0;
		for(i=0;i<n;i++){
    
    
			if(s1[i]=='0') c0++;
			else c1++;
			if(c1==c0){
    
    
				string s3;
				for(j=m1;j<=i;j++){
    
    
					if(s1[j]=='0') s3+='1';
					else s3+='0';
				}
				if(s3!=s2.substr(m1,i-m1+1)&&s1.substr(m1,i-m1+1)!=s2.substr(m1,i-m1+1)){
    
    
					flag=1;
					break;
				}
				else {
    
    
					m1=i+1;
				}
			}
		}
		string s3;
		if(s1.substr(m1,i-m1+1)!=s2.substr(m1,i-m1+1)){
    
    
			flag=1;
		}
		if(flag==1){
    
    
			cout<<"NO"<<endl;
		}
		else {
    
    
			cout<<"YES"<<endl;
		}
	}
}

C. Balance the Bits

题意:给你个01串,求两个字符串ab,看是否能使得ab左右括号匹配,当01串其中某一位的位置为0,则ab串的括号必须相反,如果为1,则a和b串的括号必须相同
思路:将前半部分的1全部改成“(”,后半部分的1全部改成‘)’,再把0按照括号匹配做一下即可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	string s1;
	int t,n,i,j;
	cin>>t;
	while(t--){
    
    
		cin>>n>>s1;
		string s2,s3;
		int cnt1=0,flag=0,cnt0=0;
		for(i=0;i<s1.length();i++){
    
    
			if(s1[i]=='1') cnt1++;
		}
		if(s1[i]=='0'||s1[n-1]=='0') flag=1;
		int a=0,b=0;
		for(i=0;i<s1.length();i++){
    
    
			if(s1[i]=='1'){
    
    
				cnt0++;
				if(s1[i]=='1'&&cnt0<=cnt1/2){
    
    
					s2+='('; a++;
					s3+='('; b++;
				}
				else if(s1[i]=='1'&&cnt0>cnt1/2) {
    
    
					s2+=')'; a--;
					s3+=')'; b--;
				}
			}
			else {
    
    
				if(a>0&&b>0){
    
    
					if(a>=b){
    
    
						s2+=')';a--;
						s3+='(';b++;
					}
					else {
    
    
						s2+='(';a++;
						s3+=')';b--;
					}
				}
				else if(a>0){
    
    
					s2+=')';a--;
					s3+='(';b++;
				}
				else if(b>0){
    
    
					s2+='(';a++;
					s3+=')';b--;
				}
				else {
    
    
					flag=1;
				}
			}
			if(a<0||b<0){
    
    
				flag=1;
//				cout<<s2<<endl<<s3<<endl;
			}
		}
		if(flag==1){
    
    
			cout<<"NO"<<endl;
		}
		else {
    
    
			cout<<"YES"<<endl;
			cout<<s2<<endl<<s3<<endl;
		}
		
	}
}

猜你喜欢

转载自blog.csdn.net/RIPKEY/article/details/115438704