The sol to Rose

Qian·JXのjoker發表於2024-11-21

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";
	}
}

水完了。