题解:P14173 【MX-X23-T3】猜拳游戏
我们不妨先寻找 Alice 的出招序列 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]]]++;
接下来我们便可以对于每组进行计算贡献,由于每组中的
- 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;
}