12号漏了一点就是多加1后后面那列改为3状态 复现一下 弥补赛场没AC的遗憾
#include<iostream>
using namespace std;
const int N = 1000005;
int state[N],nex[N],fot,dot,res;
int main()
{
string a,b;
cin>>a>>b;
for(int i=1;i<=a.length();i++){
int ta=(a[i-1]=='#')?1:0;
int tb=(b[i-1]=='#')?1:0;
state[i]=ta*2+tb;
if(state[i]){
dot=i;
if(!fot) fot=i;
}
}
int last=fot;
for(int i=fot+1;i<=dot;i++)
if(state[i]) nex[last]=i,last=i;
for(int i=fot;i<=dot;i=nex[i]){
if(i==dot) break;
res+=nex[i]-i-1;
//这里贪心的把多加那个加到后面一列而不是前面一列 整体最优
if(state[i]!=state[nex[i]]&&state[i]!=3&&state[nex[i]]!=3) res++,state[nex[i]]=3;
}
cout<<res<<endl;
return 0;
}