所有 # 可以分为三种情况
状态1:
#
#
状态2:
#
.
状态3:
.
#
对于状态1连到状态1、2、3,如下列这种情况,需要的长度为 3
# . . . # ————> # # # # #
# . . . . # . . . .
对于状态2连到状态2 或者 状态3连到状态3,如下列这种情况,需要的长度还是 3
# . . . # ————> # # # # #
. . . . . # . . . .
对于状态2连到状态3,如下列这种情况,需要的长度是 4
并且在这种情况下,最好让后面的那里变成状态1,这样对下一次连检测器有好处。
# . . . . ————> # # # # #
. . . . # . . . . #
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int, int> pii;// { # 的下标,状态}
const int N = 1e6 + 5;
int ans;
string a, b;
queue<pii> q;
int main()
{
cin >> a >> b;
int s = a.size();
// 对于有 # 的每一列,将下标和状态存入队列
for(int i = 0; i < s; i ++)
{
if(a[i] == '#' && b[i] == '#') // 上下两行都是#,记为状态1
{
q.push({i, 1});
}
else if(a[i] == '#' && b[i] != '#')// 上行是#,下行是. 记为状态2
{
q.push({i, 2});
}
else if(b[i] == '#' && a[i] != '#')// 上行是. ,下行是# 记为状态3
{
q.push({i, 3});
}
}
if(q.size() == 0) // 如果字符串里没有 #,直接输出0
{
cout << 0;
return 0;
}
auto t = q.front();
q.pop();
int lx = t.first, rx = t.second;
while(q.size())
{
auto now = q.front();
q.pop();
int i = now.first, j = now.second;
if(rx == 1 || j == 1)
{
ans += i - lx - 1;
lx = i, rx = j;
}
else if(j == rx)
{
ans += i - lx - 1;
lx = i, rx = j;
}
else if(j != rx)
{
ans += i - lx;
lx = i, rx = 1;
}
}
cout << ans;
}