码迷,mamicode.com
首页 > 其他好文 > 详细

ABC162D RGB Triplets

时间:2020-04-12 22:12:20      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:its   amp   暴力   rac   --   unsigned   不同   乘法   pac   

RGB Triplets

题目大意:有一个长度为 \(n\) 的字符串 \(s\),只包含字符 R G B,找出满足以下两个条件的三元组 \((i, j, k)\)\((1 \le i < j < k \le n)\)

  1. \(s_i \ne s_j\)\(s_i \ne s_k\)\(s_j \ne s_k\)
  2. \(j - i \ne k - j\)

首先 \(O(n^3)\) 的大暴力是过不了的>︿<

所以要优化到 \(O(n^2)\)

因为我们要得到三个字母不同的子序列,所以可以直接考虑用乘法原理。之后再进行遍历把满足 \(j - i = k - j\) 的情况去掉即可,后期遍历方式如下图:

\(j \ \begin{matrix}\underbrace{...}\\i\end{matrix} \ j+i+1 \acute{}\begin{matrix}\underbrace{...}\\i\end{matrix} \ j + 2 \times i +2\)

其中 \(j\) 表示从第 \(j\) 个数向后扩展 \(i\) 个字符和 \(2 \times i + 1\) 个字符后以及第 \(j\) 个字符是否满足 RGB 是否各有一个,如果是的,那么 \(ans\) 减一。其中 \(i\) 满足 \(0 \le i \le (n - 3) \div 2\)\(j\) 满足 \(j \ge 1\) 并且 \(j + i \times 2 + 2 \le n\)

就直接看代码了:

#include <bits/stdc++.h>
using namespace std;

inline long long read(){    //快读
    long long s = 0, w = 1;
    char ch = getchar();
    while (ch < ‘0‘ || ch > ‘9‘){
        if (ch == ‘-‘) w = -1;
        ch = getchar();
    }
    while (ch >= ‘0‘ && ch <= ‘9‘){
        s = s * 10 + ch - ‘0‘;
        ch = getchar();
    }
    return s * w;
}
long long n, r, g, b;
unsigned long long ans; //usnigned 用不用好像都无所谓……
char s[4040];           //千万不能用string,不然会炸掉
int main(){
    n = read();
    for (int i = 1; i <= n; i++){
        s[i] = getchar();
        if (s[i] == ‘R‘) r++;    //对r, g, b计算一个初始值,方便使用乘法原理
        if (s[i] == ‘G‘) g++;
        if (s[i] == ‘B‘) b++;
    }
    ans = r * g * b;  //乘法原理预处理ans,但多出来很多的不符合条件的答案
    int _n = (n - 3) >> 1;  //计算(n-3)/2
    for (int i = 0; i <= _n; i++){  //枚举两个字符之间的差
        for (int j = 1; j + 2 * i + 2 <= n; j++){  //枚举j的大小
            if (s[j] != s[j+i+1] && s[j] != s[j+i*2+2] && s[j+i+1] != s[j+i*2+2]){  //如果满足条件1,就讲ans--
                ans--;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

ABC162D RGB Triplets

标签:its   amp   暴力   rac   --   unsigned   不同   乘法   pac   

原文地址:https://www.cnblogs.com/louyj/p/ABC162D.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!