Gym-100712B-Rock-Paper-Scissors

分别预处理前k(k=0,1,2,…,n)次均出剪刀、石头或布的得分。
然后枚举他们的边界判断得分是否大于0即可

#include<cstdio> 
#include<cstring> 
#include<iostream> 
#include<algorithm> 
using namespace std;  
char s[1005];  
int cnt[3][1005];  
int main()  
{  
    int T;  
    scanf("%d",&T);  
    while(T--)  
    { 
        memset(cnt,0,sizeof(cnt));
        int n;  
        scanf("%d",&n);  
        scanf("%s",s);  
        for(int i=1;i<=n;i++)  
        {  
            cnt[0][i]=cnt[0][i-1]+(s[i-1]=='S')-(s[i-1]=='P');  
            cnt[1][i]=cnt[1][i-1]+(s[i-1]=='R')-(s[i-1]=='S');  
            cnt[2][i]=cnt[2][i-1]+(s[i-1]=='P')-(s[i-1]=='R');  
        }  
        int ans=0;  
        for(int i=0;i<=n;i++)  
        {  
            for(int j=i;j<=n;j++)  
            {  
                if(cnt[0][i]+cnt[1][j]-cnt[1][i]+cnt[2][n]-cnt[2][j]>0)ans++;  
            }  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
}  

你可能感兴趣的:(Gym-100712B-Rock-Paper-Scissors)