Rock-Paper-Scissors
2015-07-20 09:36
330 查看
/* Author: 2486 Memory: 0 KB Time: 31 MS Language: GNU G++ 4.9.2 Result: Accepted Public: No Yes */ //对于存在一定的极少区间段而言,可以使用前辍和进行标记,使得达到查找接近O(n) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1000+5; int T,n; int R[2][maxn],S[2][maxn],P[2][maxn]; char str[maxn]; int Compare(char x,char y) { if(x=='P'&&y=='R'||x=='S'&&y=='P'||x=='R'&&y=='S') { return 1; } if(x==y)return 2; return 0; } int main() { //freopen("D://imput.txt","r",stdin); scanf("%d",&T); while(T--) { memset(R,0,sizeof(R)); memset(S,0,sizeof(S)); memset(P,0,sizeof(P)); scanf("%d%s",&n,str); for(int i=0; i<n; i++) { R[0][i+1]=R[0][i]; R[1][i+1]=R[1][i]; P[0][i+1]=P[0][i]; P[1][i+1]=P[1][i]; S[0][i+1]=S[0][i]; S[1][i+1]=S[1][i]; if(Compare('R',str[i])==1) { R[0][i+1]=R[0][i]+1; } else if(Compare('R',str[i])==0) { R[1][i+1]=R[1][i]+1; } if(Compare('P',str[i])==1) { P[0][i+1]=P[0][i]+1; } else if(Compare('P',str[i])==0){ P[1][i+1]=P[1][i]+1; } if(Compare('S',str[i])==1) { S[0][i+1]=S[0][i]+1; } else if(Compare('S',str[i])==0){ S[1][i+1]=S[1][i]+1; } } int cnt=0; for(int i=0; i<=n; i++) { for(int j=i; j<=n; j++) { if(R[0][i]+P[0][j]-P[0][i]+S[0] -S[0][j]-R[1][i]-(P[1][j]-P[1][i])-(S[1] -S[1][j])>0) { cnt++; //printf("[%d,%d]\n",i,j); } } } printf("%d\n",cnt); } return 0; }
相关文章推荐
- URLConnection的连接、超时、关闭用法总结
- 初试 Coding.net 在线IDE——WebIDE
- Node:向经典致敬(八皇后)
- 基于OpenCV的傅里叶变换及逆变换
- C++中通过指针修改类内私有成员变量 & 类的大小
- iOS基础面试题一
- 哈希函数和哈希表
- (中等) POJ 3280 Cheapest Palindrome,DP。
- Java 阅读TXT文件
- C/C++校招笔试面试经典题目总结五
- MapReduce的笔记
- HDOJ 1257 最少拦截系统
- FineReport搭建物流报表平台的解决方案
- MySQL(1):启动MySQL服务,客户端连接服务
- <a>标签中href和onclick传递this对象的实现方法
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
- redis常用命令
- Android快速开发不可或缺的11个工具类
- android---手电筒之摩尔斯电码
- LeeCode-Two Sum