The sol to Rose
https://www.luogu.com.cn/problem/P11207
思路
先暴力模擬處理答案為 \(0\) 的情況。
其次,顯然的,答案最大為2。
再次,如果此時三種顏色的卡牌累計出現次數為 \((k,k+1,k+2)\),那麼顯然可以透過修改一次得到對方獲勝。
注意一個問題:如果我在她之前也出現 \((k,k+1,k+2)\) 這種狀態,且修改的卡牌位置在這一刻之前,那麼我將先獲勝。所以還要特判這種情況。
最後,我們還需保證修改的卡牌在我出現三張牌出現次數相等的情況之前。同樣也是特判。
口胡結束。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,x,y) for(ll i=x;i<=y;i++)
const ll N=2e5+10;
ll q,n,a[N];
string s1,s2;
map<char,ll> pa;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
pa['P']=1;
pa['W']=2;
pa['V']=3;
cin>>q;
while(q--) {
cin>>n>>s1>>s2;
n<<=1;
FOR(i,1,n) {
if(i%2) a[i]=pa[s1[i>>1]];
else a[i]=pa[s2[(i>>1)-1]];
}
ll cnt1=0,cnt2=0,cnt3=0,p=N;
bool f=0;
FOR(i,1,n) {
if(a[i]==1) cnt1++;
else if(a[i]==2) cnt2++;
else cnt3++;
if(cnt1==cnt2&&cnt2==cnt3) {
if(i%2) {
cout<<"0\n";
f=1;
}
p=i;
break;
}
}
if(f) continue;
cnt1=cnt2=cnt3=0;
ll t12=0,t13=0,t21=0,t23=0,t31=0,t32=0;
for(ll i=1;i<=n;i+=2) {
if(a[i]==1) cnt1++;
else if(a[i]==2) cnt2++;
else cnt3++;
if(cnt1-1==cnt2&&cnt2-1==cnt3&&p>t12){
cout<<"1\n";
f=1;
break;
}else if(cnt1-1==cnt3&&cnt3-1==cnt2&&p>t13){
cout<<"1\n";
f=1;
break;
}else if(cnt2-1==cnt1&&cnt1-1==cnt3&&p>t21){
cout<<"1\n";
f=1;
break;
}else if(cnt2-1==cnt3&&cnt3-1==cnt1&&p>t23){
cout<<"1\n";
f=1;
break;
}else if(cnt3-1==cnt1&&cnt1-1==cnt2&&p>t31){
cout<<"1\n";
f=1;
break;
}else if(cnt3-1==cnt2&&cnt2-1==cnt1&&p>t32){
cout<<"1\n";
f=1;
break;
}
if(a[i+1]==1) cnt1++;
else if(a[i+1]==2) cnt2++;
else cnt3++;
if(cnt1-1==cnt2&&cnt2-1==cnt3) t12=i;
else if(cnt1-1==cnt3&&cnt3-1==cnt2) t13=i;
else if(cnt2-1==cnt1&&cnt1-1==cnt3) t21=i;
else if(cnt2-1==cnt3&&cnt3-1==cnt1) t23=i;
else if(cnt3-1==cnt1&&cnt1-1==cnt2) t31=i;
else if(cnt3-1==cnt2&&cnt2-1==cnt1) t32=i;
}
if(f==0) cout<<"2\n";
}
}
水完了。