Binary Strings
题目描述:
这个题目讲述的是,给定两个字符串和,这两个字符串由0和1组成,给定了两个操作,第一个操作是可以将字符串的最后一个字符移到字符串的最前面,第二个操作是可以将连续的两个字符反转,这个题目是将第一个字符和最后一个字符视为连续,然后题目问我们最少可以用多少次第二个操作来使字符串变成,如果不能通过以上两个操作使字符串变成的话,那么输出-1。
题目分析:
首先,我们先判断-1的情况,我们会发现第一个操作只是改变字符串各个字符之间的位置,没有改变到0和1的数量,而第二种操作可以分为四种情况:00,01,10以及11。经过反转之后,可以变成11,10,01,00,我们可以发现0增加或者减少的数量以及1增加或者减少的数量均为偶数。因此,可以得出结论,如果字符串中0的数量与字符串中0的数量奇偶性不一样的话,输出-1。
接下来,我们要求出从字符串变成的最少操作次数,首先我们要知道,不同位置实行第二个操作来使字符串变成,操作次数是不一样的,因此我们要对字符串的每个位置进行枚举,然后从这个位置开始进行第二个操作,然后使字符串变成,求出最少的操作次数。
代码:
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <cstdlib>
#include <stdlib.h>
#include <cmath>
#include <math.h>
#include <algorithm>
#include <cstring>
#include <string>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <deque>
#define reg register
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define eps 1e-3
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define lowbit(x) (x&(-x))
using namespace std;
const int Maxn=5005;
char A[Maxn*2],B[Maxn];
int n,ans;
void solve(char *s,int cnt)
{
for (int i=0;i<n-1;i++)
if (s[i]!=B[i])
{
s[i]='1'-(s[i]-'0');
s[i+1]='1'-(s[i+1]-'0');
cnt++;
}
if (s[n-1]==B[n-1]) ans=min(ans,cnt);
}
int main()
{
scanf("%s%s",A,B);
int num1=0,num2=0;
n=strlen(A);
for (int i=0;i<n;i++)
if (A[i]=='0') num1++;
for (int i=0;i<n;i++)
if (B[i]=='0') num2++;
if ((num1&1)!=(num2&1))
{
printf("-1\n");
return 0;
}
for (int i=0;i<n;i++) A[i+n]=A[i];
ans=INF;
for (int i=0;i<n;i++)
{
char c[Maxn];
memcpy(c,A+i,sizeof(char)*n);
solve(c,0);
memcpy(c,A+i,sizeof(char)*n);
c[0]='1'-(c[0]-'0');
c[n-1]='1'-(c[n-1]-'0');
solve(c,1);
}
printf("%d\n",ans);
return 0;
}