列表

详情


NC200581. BAD String

描述

给定一个只含大写字母的字符串S。
lililalala认为如果一个串含有`"BAD"`子串,那么这个串是BAD String ,反之如果不含`"BAD"`子串则不是。
现在lililalala**必须**选择S串中两个**不同**位置上的字母并将它们交换,然后得到一个新的串S',请问lililalala是否可以使得交换完毕后S’串不是一个BAD String。如果可以,请输出一种可能得到的S’,否则请作出不存在的判断。
一个串的子串可以理解为该串中连续的一段。

输入描述

第一行一个数字,表示样例个数。 
其中每个样例:
仅包含一行一个只含大写字母的字符串S。
保证S的长度在[2,2000]内。

输出描述

每个样例输出一行。 
如果可以得到不是BAD String的S’,请输出任意一个符合要求S’的
如果不存在任何符合条件的S’,请输出"-1"(不带引号)。

示例1

输入:

9
ABD
ADB
BAD
BDA
DAB
DBA
BDD
BADBAD
BADBADBAD

输出:

DBA
BDA
DAB
ADB
DBA
ABD
BDD
BABDAD
-1

说明:

第一个样例的样例输出交换了第1个和第3个字符<br/>
第二个样例的样例输出交换了第1个和第3个字符<br/>
第三个样例的样例输出交换了第1个和第3个字符<br/>
第四个样例的样例输出交换了第1个和第3个字符<br/>
第五个样例的样例输出交换了第2个和第3个字符<br/>
第六个样例的样例输出交换了第1个和第3个字符<br/>
第七个样例的样例输出交换了第1个和第3个字符<br/>
第八个样例的样例输出交换了第3个和第4个字符<br/>
第九个样例不存在符合要求的串。<br/>
答案不唯一,只要输出符合题意即可通过。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.5.2) 解法, 执行用时: 39ms, 内存消耗: 4528K, 提交时间: 2020-07-31 17:09:32

import random
def find(lis):
    for i in range(len(lis)-2):
        if s[i]=="B" and s[i+1]=="A" and s[i+2]=="D":
            return 1
    return 0
for _ in range(int(input())):
    temp=input()
    mp=[]
    cnt=0
    s=list(temp)
    for i in range(len(s)-2):
        if s[i]=="B" and s[i+1]=="A" and s[i+2]=="D":
            mp.append(i)
            cnt+=1
        if cnt>2:
            break
    if cnt>2:
        print(-1)
    elif cnt == 2:
        s[mp[0]],s[mp[1]+1] = s[mp[1]+1],s[mp[0]]
        print(''.join(s))
    elif cnt==1:
        s[mp[0]],s[mp[0]+1] = s[mp[0]+1],s[mp[0]]
        print(''.join(s))
    else:
        while True:
            a=random.randint(0,len(s)-1)
            b=random.randint(0,len(s)-1)
            if a==b:
                continue
            s[a],s[b] = s[b],s[a]
            if find(s):
                s[a],s[b] = s[b],s[a]
            else:
                print(''.join(s))
                break

C(clang 3.9) 解法, 执行用时: 2ms, 内存消耗: 360K, 提交时间: 2019-12-28 20:21:49

#include <stdio.h>

int main()
{
	int T;
	scanf("%d", &T);
	scanf("\n");
	for (int i = 0; i < T; i++) {
		char str[2001];
		gets(str);
		int len = strlen(str);

		char *s1 = strstr(str, "BAD");
		if (s1 == NULL) {
			for (int j = 0; j < len; j++) {
				char t = str[j];
				for (int k = j + 1; k < len; k++) {
					char o = str[k];
					str[j] = str[k];
					str[k] = t;
					if (strstr(str, "BAD") == NULL) {
						printf("%s\n", str);
						goto next;
					}
					str[k] = o;
				}
				str[j] = t;
			}

			printf("-1\n");
			goto next;
		}


		char *s2 = strstr(s1 + 3, "BAD");
		if (s2 == NULL) {
			s1[0] = 'A';
			s1[1] = 'B';
			printf("%s\n", str);
			goto next;
		}

		char *s3 = strstr(s2 + 3, "BAD");
		if (s3 == NULL) {
			s1[0] = 'A';
			s2[1] = 'B';
			printf("%s\n", str);
			goto next;
		}

		printf("-1\n");
		goto next;

	next:
		;
	}
}

C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 356K, 提交时间: 2019-12-28 21:28:50

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	string a;
	string b="BAD";
	scanf("%d",&t);
	while(t--){
		cin>>a;
		int index=0,l=a.size(),ans=0,j=0;
		int last[2];last[0]=last[1]=0;
		for(int i=0;i<l;i++){
			if(b[index]==a[i]){
				index++;
				if(index==3){ans++;index=0;if(j<2){last[j]=i;j++;}}
			}
			else {index=0;if(b[index]==a[i])index++;}
		}
		if(ans>2)printf("-1\n");
		else if(ans==1){
		    a[last[0]]='A';
		    a[last[0]-1]='D';
		    printf("%s\n",a.c_str()); 
		}
		else if(ans==2){
			a[last[0]-1]='B';
			a[last[1]-2]='A';
			printf("%s\n",a.c_str());
		}
		else if(ans==0){
			if(a[0]=='A'&&a[1]=='B'){
				char tem=a[l-1];
				a[l-1]=a[0];
				a[0]=tem;
			}
			else {
				char tem=a[1];
				a[1]=a[0];
				a[0]=tem;
			}
			printf("%s\n",a.c_str());
		}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 352K, 提交时间: 2019-12-28 21:47:29

#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> vp;
int main(){
	int T,num,i,len;
	cin>>T;
	string s;
	while(T--){
		cin>>s;
		vp.erase(vp.begin(),vp.end());
		len=s.length();
		num=0;
		for(i=0;i<len;i++){
			if(s[i]=='B'&&s[i+1]=='A'&&s[i+2]=='D'){
				num++;
				vp.push_back(i);
				i+=2;
			}
		}
		if(num<3){
			if(num==1){
				swap(s[vp[0]],s[vp[0]+1]);
				cout<<s<<endl;
			}
			else if(num==2){
				swap(s[vp[0]+2],s[vp[1]]);
				cout<<s<<endl;
			}
			else{
				if(s[0]=='A'&&s[1]=='B'&&s[2]=='D')
					swap(s[1],s[2]);
				else
					swap(s[0],s[1]);
				cout<<s<<endl;
			}
		}
		else
			cout<<-1<<endl;
	}
	
	
	return 0;
}

上一题