Advertisement

Binary Strings

阅读量:

Binary Strings

题目描述:

这个题目讲述的是,给定两个字符串

A

B

这些二进制字符串由0与1构成,并定义了两个基本的操作:第一个操作是将字符串末尾的字符移动至首位位置;第二个操作是翻转相邻的两个字符。本题假设首尾字符被视为相邻,并询问最少需要执行多少次第二种操作才能达到目标状态。

A

变成

B

,如果不能通过以上两个操作使字符串

A

变成

B

的话,那么输出-1。

题目分析:

首先

A

中0的数量与字符串

B

中0的数量奇偶性不一样的话,输出-1。

接下来,我们要求出从字符串

A

变成

B

的最少操作次数,首先我们要知道,不同位置实行第二个操作来使字符串

A

变成

B

,操作次数是不一样的,因此我们要对字符串

A

遍历每一个字符的位置,在该位置上执行第一个操作;接着对该位置执行后续操作;使得字符串完成相应的处理过程

A

变成

B

,求出最少的操作次数。

代码:

复制代码
 #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;
    
 }

全部评论 (0)

还没有任何评论哟~