5 条题解

  • 0
    @ 2026-5-29 18:06:54

    直接前缀和预处理后以k倍数的区间长度进行前缀和查询即可,手算运行次数n^2 / k - 26 * n, 最坏情况运行7e9,一个n^2的算法,数据没有卡,极限时间900ms,可以直接过

    const int N = 1e5 + 10;
    int sum[26][N];
    void solve() {
        int n,k;
        cin >> n >> k;
        string s;
        cin >> s;
        s = " " + s;
        for(int j = 1; j <= n ; j ++ ) {
            for(int i = 0 ; i < 26 ; i ++ ){
                sum[i][j] = sum[i][j - 1];
            }
            sum[s[j] - 'a'][j] ++ ;
        }
        ll ans = 0;
        for(int i = k ; i <= n; i += k ) {
            for(int x = i ; x <= n ; x ++ ){
                bool ok = false;
                for(int j = 0 ; j < 26 ; j ++ ) {
                    if(sum[j][x] - sum[j][x - i] == 0)continue;
                    if(sum[j][x] - sum[j][x - i] != k) {
    //                  cout << (char)(j + 'a') << ' ' << x << ' ' << x - i<< endl;
    //                  cout << sum[j][x] << ' ' << sum[j][x - i] << endl;
    //                  ans ++ ;
                        ok = true;
                    }
                }
                if(!ok) ans ++ ;
            }
        }
         cout << ans;
    }
    

    信息

    ID
    170
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    749
    已通过
    181
    上传者