Luogu P14173 【MX-X23-T3】猜拳游戲 題解
我們不妨先尋找 Alice 的出招序列 \(a\) 中的 \(a_i\) 與 Bob 的出招序列 \(b\) 中的 \(b_j\) 在什么時候會在同一局中出現,考慮 Alice 與 Bob 會進行 \(10^{100}\) 局游戲,所以可以認為是無限局游戲,那么只要 \(nx+i=by+j\) 存在一對非負整數解 \((x,y)\),\(a_i\) 與 \(b_j\) 會在同一局中出現。又根據裴蜀定理,\(nx+i=by+j\) 存在一對非負整數解 \((x,y)\) 的充要條件是 \(i\equiv j (mod\ \gcd(n,m))\),所以我們可以根據 \(i\) 或 \(j\) 對 \(\gcd(n,m)\) 的余數進行分組,分別記錄 \(a\) 和 \(b\) 中對 \(\gcd(n,m)\) 余數相同的位置的 RPS 個數分別是多少,代碼如下:
mp['P']=1;
mp['S']=2;
for(int i=0;i<n;i++)
cnt[i%l][mp[a[i]]]++;
for(int j=0;j<m;j++)
cnt1[j%l][mp[b[j]]]++;
接下來我們便可以對于每組進行計算貢獻,由于每組中的 \(i,j\) 都滿足 \(nx+i=by+j\) 存在一對非負整數解 \((x,y)\),那么里面所有的 \(a_i\) 與 \(b_j\) 兩兩都會在某一局中同時出現,于是我們存在兩種修改序列的方式:
- Alice 所有在這一組的位置的出招均為
RPS中的同一種 \(X\),Bob 的則為RPS中的另兩種,貢獻為 Alice 所有在這一組的位置的出招不為 \(X\) 的個數加上 Bob 所有在這一組的位置的出招為 \(X\) 的個數; - Bob 所有在這一組的位置的出招均為
RPS中的同一種 \(X\),Alice 的則為RPS中的另兩種,貢獻與第一種類似。
我們取每一組在上面兩種方案中的最小值加到總貢獻上即可算出答案。
CODE
#include<bits/stdc++.h>
using namespace std;
int n,m,l,cnt[500005][3],cnt1[500005][3];
string a,b;
map<char,int> mp;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
l=__gcd(n,m);
cin>>a>>b;
mp['P']=1;
mp['S']=2;
for(int i=0;i<n;i++)
cnt[i%l][mp[a[i]]]++;
for(int j=0;j<m;j++)
cnt1[j%l][mp[b[j]]]++;
int ans=0;
for(int i=0;i<l;i++){
int k1,k2;
k1=min({cnt[i][0]+cnt[i][1]+cnt1[i][2],cnt[i][0]+cnt[i][2]+cnt1[i][1],cnt[i][2]+cnt[i][1]+cnt1[i][0]});
k2=min({cnt1[i][0]+cnt1[i][1]+cnt[i][2],cnt1[i][0]+cnt1[i][2]+cnt[i][1],cnt1[i][2]+cnt1[i][1]+cnt[i][0]});
ans+=min(k1,k2);
}
cout<<ans;
return 0;
}

浙公網安備 33010602011771號