1 条题解

  • 0
    @ 2025-8-16 16:31:07

    O(N2)O(N^2)

    统计数量:

    颜色不同:S[i], S[j], S[k] 互不相同。

    位置不等差:j - i ≠ k - j(即三个位置不是等差数列)。

    解题思路

    条件1:先统计所有满足颜色互不相同的三元组。

    条件2:从这些三元组中减去不满足位置条件(即 j - i = k - j)的数量。

    具体步骤:

    计算所有颜色互不相同的三元组总数。

    计算其中不满足位置条件的三元组数量。

    最终结果 = 总数 - 不满足位置条件的数量。

    关键步骤

    1. 统计颜色互不相同的三元组,

    减去颜色不满足的三元组数(即至少有两个字符相同的情况)。

    1. 统计不满足位置条件的三元组:

    对于所有可能的 iiddd>0d > 0 ),检查 ( i,i+d,i+2di, i + d , i+2d ) 是否满足颜色互不相同。

    这些三元组会被错误地包含在总数中,需要减去。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    typedef pair<LL, LL> PII;
    
    #define x first
    #define y second
    
    const int N = 2e5 + 10, M = 30;
    
    
    void solve() 
    {
        int n;
        string s;
        cin >> n >> s;
        int r = 0, g = 0, b = 0;
        for(int i = 0; i < n; i ++)
        {
            
            if(s[i] == 'R') r ++;
            else if(s[i] == 'G') g ++;
            else b ++;
        }
        LL ans = r * g * (LL)b;
        
        for(int i = 0; i < n; i ++)
            for(int j = i + 1; j < n; j ++)
            {
                int k = j + j - i;
                if(k >= n) continue;
                if(s[i] != s[j] && s[j] != s[k] && s[k] != s[i])
                    ans --;
            }
        cout << ans << endl;
    }            
    
    int main()
    {
        int t = 1;
        // cin >> t;
        while(t --)
            solve();
    }
    
    • 1

    信息

    ID
    533
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    10
    已通过
    3
    上传者