题意:给你两个二进制字符型a,b和 x,y(x>=y),然后你可以选择两个下标l,r,使,
,进行操作后会根据l,r的位置关系产生相应的费用:
如果 ,那么消耗的费用为x,否则就会消耗y。问你怎么消耗最少的费用,使a变成b。
思路:首先记录有多少个需要转换,对于转换的情况,如果 l,r 位置的字母有一个满足,那么需要转换的次数是不变的,如果两个都满足就不需要换,两个都不满足就需要的数量-2,那么对于所有的转换次数,只有转换次数为偶数时才可以使a=b
然后因为x<=y,那么转换的时候只要一直不使,就可以一直消耗最少的策略。那么可以推出,在总数量大于2的时候,可以一直进行总和为y的操作。
而如果总数量为2,就看是否是连续的,如果是连续的就取x和y*2的最小值(y*2代表每个字母分别和同一个字母进行操作),如果不是直接就是y,然后输出结果就好了
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
#include<cstdio>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include<vector>
#include<queue>
#include<map>
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;
const int N=100000+100;
ll n ,m,h;
char a[N],b[N];
int main()
{
int t;
sc_int(t);
while(t--)
{
cin>>n>>m>>h;
cin>>a+1>>b+1;
int sum=0;
bool flag=0;
for(int i =1;i<=n;i++)
{
if(a[i]!=b[i])sum++;
if(a[i]!=b[i]&&a[i+1]!=b[i+1]&&i+1<=n)flag=1;
}
if(sum%2!=0){
cout<<"-1\n";
continue;
}
ll res=0;
if(sum!=2||!flag) cout<<sum/2*h<<endl;
else cout<<min(m,h*2)<<endl;
}
return 0;
}