## Editorial for Majstor

Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

#### Code mẫu của flashmt

var n,m:byte;cur,re:integer;a:array[0..50,1..50] of byte;r:array[0..2] of integer;
function max(a,b,c:integer):integer;begin if (a>b) and (a>c) then max:=a else begin if b>c then max:=b else max:=c;end;end;
procedure pr;var i,j:byte;begin cur:=0; re:=0;for j:=1 to n do begin fillchar(r,sizeof(r),0);for i:=1 to m do begin if a[0,j]=a[i,j] then cur:=cur+1 else begin if (a[0,j]+2) mod 3 = a[i,j] then cur:=cur+2;
end;
inc(r[a[i,j]]);
inc(r[(a[i,j]+1) mod 3],2);
end;
re:=re+max(r[0],r[1],r[2]);
end;
end;
procedure wf;
begin writeln(cur);write(re);end;
begin rf;pr;wf;end.


uses    math;
const   q:array[1..3] of char=('P','R','S');
var     inp:text;
r,n,i,j,k,t,res,rmax:longint;
c:array[1..99,'A'..'Z'] of longint;
win:array['A'..'Z'] of char;
s,a:string;
begin
assign(inp,'');reset(inp);
win['S']:='P';
win['R']:='S';
win['P']:='R';
for i:=1 to n do
begin
for j:=1 to r do inc(c[j,a[j]]);
end;
for j:=1 to r do
begin
inc(res,c[j,s[j]]+2*c[j,win[s[j]]]);
t:=0;
for k:=1 to 3 do t:=max(t,c[j,q[k]]+2*c[j,win[q[k]]]);
inc(rmax,t);
end;
writeln(res);writeln(rmax);
end.


#### Code mẫu của RR

uses math;
const
FINP='';
FOUT='';
var
f1,f2:text;
round,n:longint;
s:string;
a:array[1..50] of string;
procedure openF;
begin
assign(f1,FINP); reset(f1);
assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
close(f1);close(f2);
end;
procedure inp;
var
i:longint;
begin
for i:=1 to n do
end;
function cal(c1,c2:char):longint;
begin
if c1=c2 then exit(1);
if c1='S' then if c2='P' then exit(2) else exit(0);
if c1='P' then if c2='R' then exit(2) else exit(0);
if c1='R' then if c2='S' then exit(2) else exit(0);
end;
procedure solve;
var
i,j,sum,x,y,z:longint;
begin
sum:=0;
for i:=1 to round do
for j:=1 to n do
sum+=cal(s[i],a[j,i]);
writeln(f2,sum);
sum:=0;
for i:=1 to round do
begin
x:=0; y:=0; z:=0;
for j:=1 to n do
begin
x+=cal('S',a[j,i]);
y+=cal('P',a[j,i]);
z+=cal('R',a[j,i]);
end;
sum+=max(max(x,y),z);
end;
writeln(f2,sum);
end;
begin
openF;
inp;
solve;
closeF;
end.


#### Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
#include <string.h>
int Maxx(int a,int b,int c)
{
int T=a;
if(b>T) T=b;
if(c>T) T=c;
return T;
}
main()
{
int N,c[4][52],T,KQ=0,max=0;
char a[52],b[52][52];
scanf("%d",&N);
scanf("%s",a);
//for(int j=0;j<N;j++)
//printf("%c",a[j]);
scanf("%d",&T);
for(int i=1;i<=T;i++)
scanf("%s",b[i]);
for(int i=1;i<=T;i++)
for(int j=0;j<N;j++)
{
if((b[i][j]=='S'&&a[j]=='R')||(b[i][j]=='R'&&a[j]=='P')||(b[i][j]=='P'&&a[j]=='S'))
KQ+=2;
if(b[i][j]==a[j])
KQ+=1;
}
for(int i=1;i<=3;i++)
for(int j=0;j<N;j++)
c[i][j]=0;
for(long i=0;i<N;i++)
{
for(int j=1;j<=T;j++)
{
if(b[j][i]=='S')
c[1][i]++;
else if(b[j][i]=='R')
c[2][i]++;
else if(b[j][i]=='P')
c[3][i]++;
}
max+=Maxx(2*c[1][i]+c[2][i],2*c[2][i]+c[3][i],2*c[3][i]+c[1][i]);
}
printf("%d\n%d\n",KQ,max);
//getch();
}


#### Code mẫu của ll931110

Var s,p,r: array[1..50] of byte;
n,k: byte;
q,i,j,m: integer;
x,y: string;
Function calc(i: byte): byte;
Begin
If x[i] = y[i] then exit(1);
If ((x[i] = 'S') and (y[i] = 'R')) or ((x[i] = 'R') and (y[i] = 'P')) or ((x[i] = 'P') and (y[i] = 'S')) then exit(0);
calc:= 2;
End;
Function max(d,e,f: byte): byte;
Begin
max:= d;
If max < e then max:= e;
If max < f then max:= f;
End;
Begin
q:= 0;
Fillchar(s, sizeof(s), 0);
Fillchar(p, sizeof(p), 0);
Fillchar(r, sizeof(r), 0);
For i:= 1 to n do
Begin
For j:= 1 to k do
Begin
q:= q + calc(j);
If y[j] = 'S' then inc(s[j])
else if y[j] = 'R' then inc(r[j])
else inc(p[j]);
End;
End;
m:= 0;
For i:= 1 to k do
m:= m + max(2 * p[i] + s[i],2 * s[i] + r[i],2 * r[i] + p[i]);
Writeln(q); Writeln(m);
End.


#### Code mẫu của skyvn97

#include<stdio.h>
#define MAX   55
int m,n;
char a[MAX];
char e[MAX][MAX];
int max(int x,int y,int z) {
int m=x;
if (m<y) m=y;
if (m<z) m=z;
return (m);
}
int score(char x,char y) {
if (x==y) return (1);
if (x=='S') return (2*(y=='P'));
if (x=='P') return (2*(y=='R'));
if (x=='R') return (2*(y=='S'));
}
void init(void) {
int i,j;
int s=0;
scanf("%d",&m);
scanf("%s",a);
scanf("%d",&n);
for (i=1;i<=n;i=i+1) {
scanf("%s",e[i]);
for (j=1;j<=m;j=j+1)
s=s+score(a[j-1],e[i][j-1]);
}
printf("%d\n",s);
}
void process(void) {
int s,p,r,best,i,j;
best=0;
for (i=1;i<=m;i=i+1) {
s=0;
r=0;
p=0;
for (j=1;j<=n;j=j+1) {
if (e[j][i-1]=='S') s++;
if (e[j][i-1]=='P') p++;
if (e[j][i-1]=='R') r++;
}
best+=max(s+2*p,p+2*r,r+2*s);
}
printf("%d",best);
}
int main(void) {
init();
process();
}


#### Code mẫu của khuc_tuan

#include <iostream>
#include <cstdio>
using namespace std;

#define R(i,n) for(i=0;i<n;++i)
#define M(a,b) ((a)==(b)?1:((a)==((b)+1)%3?2:0))
int r, n, i, j, f[99], sum, best, z, t;
char s[55],a[55][55];

int main() {
f['S']=0;f['R']=1;f['P']=2;
cin>>r;
gets(s);gets(s);
R(i,r)s[i]=f[s[i]];
cin>>n;
gets(a[0]);
R(i,n){gets(a[i]);R(j,r)a[i][j]=f[a[i][j]];
R(j,r)sum+=M(s[j],a[i][j]);
}
cout<<sum<<endl;
sum=0;
R(i,r){
best=0;
R(t,3){
z=0;
R(j,n)z+=M(t,a[j][i]);
if(best<z)best=z;
}
sum+=best;
}
cout<<sum<<endl;
return 0;
}