codeforces Div2 A. You Are Given Two Binary Strings…(求字典序最小)
题目
http://codeforces.com/contest/1202/problem/A
题意
给你两个二进制字符串x,y。给你公式:Sk=f(x) + f(y)⋅2k让你求k等于多少的时候,这个Sk反转之后的字典序是最小的。(1≤f(y)≤f(x)≤105)
题解
f(y)⋅2k实际上就是左移k位的意思。我们要得到相加后反转字典序最小的,那么我们就要保证相加之后,后面的1尽可能的少。所以我的思路就是找到两个字符串最后一位的1,如果他们的1在同一位k就等于0。否则就要y的最后一位1一直左移直到对上x的1。
AC代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define ll long long
char s1[100005],s2[100005];
char s[100005],ans[100005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(s,0,sizeof(s));
scanf("%s %s",s1,s2);
int len1 = strlen(s1),len2 = strlen(s2);
int l1,l2,n,k=0;
for(int i=len1-1;i>=0;i--)
{
if(s1[i] == '1')
{
l1 = len1-i;
break;
}
}
for(int i=len2-1;i>=0;i--)
{
if(s2[i] == '1')
{
l2 = len2-i;
break;
}
}
n = max(l1,l2);
if(l2<l1)
{
k = l1-l2;
}
else if(l2>l1)
{
while(1)
{
if(s1[len1-n] == '1')
break;
k++;
n++;
}
}
printf("%d\n",k);
}
return 0;
}