The sol to Rose
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";
}
}
水完了。

浙公网安备 33010602011771号