/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 340.0 KiB
#2 Accepted 6ms 536.0 KiB
#3 Accepted 7ms 532.0 KiB
#4 Accepted 7ms 764.0 KiB
#5 Accepted 9ms 576.0 KiB
#6 Accepted 13ms 532.0 KiB
#7 Accepted 12ms 532.0 KiB
#8 Accepted 14ms 532.0 KiB
#9 Accepted 9ms 532.0 KiB
#10 Accepted 11ms 576.0 KiB
#11 Accepted 16ms 532.0 KiB
#12 Accepted 9ms 532.0 KiB
#13 Accepted 9ms 532.0 KiB
#14 Accepted 9ms 576.0 KiB
#15 Accepted 18ms 532.0 KiB
#16 Accepted 9ms 532.0 KiB
#17 Accepted 17ms 532.0 KiB
#18 Accepted 18ms 536.0 KiB
#19 Accepted 18ms 532.0 KiB
#20 Accepted 6ms 532.0 KiB
#21 Accepted 6ms 532.0 KiB
#22 Accepted 25ms 1.414 MiB
#23 Accepted 7ms 1.27 MiB
#24 Accepted 9ms 1.438 MiB
#25 Accepted 9ms 1.02 MiB
#26 Accepted 21ms 1.297 MiB
#27 Accepted 16ms 1.332 MiB
#28 Accepted 17ms 1.09 MiB
#29 Accepted 22ms 1.34 MiB
#30 Accepted 22ms 1.27 MiB
#31 Accepted 10ms 1.367 MiB
#32 Accepted 5ms 532.0 KiB
#33 Accepted 5ms 532.0 KiB
#34 Accepted 11ms 576.0 KiB
#35 Accepted 11ms 572.0 KiB
#36 Accepted 11ms 580.0 KiB
#37 Accepted 38ms 612.0 KiB
#38 Accepted 15ms 532.0 KiB
#39 Accepted 17ms 604.0 KiB
#40 Accepted 17ms 612.0 KiB
#41 Accepted 17ms 532.0 KiB
#42 Accepted 3ms 532.0 KiB
#43 Accepted 3ms 580.0 KiB
#44 Accepted 6ms 784.0 KiB
#45 Accepted 6ms 788.0 KiB
#46 Accepted 6ms 828.0 KiB
#47 Accepted 6ms 840.0 KiB
#48 Accepted 6ms 788.0 KiB
#49 Accepted 6ms 788.0 KiB
#50 Accepted 7ms 788.0 KiB

Code

#include <iostream>
#include <vector>
#include <string>
#include <cstring> // for memset
#include <algorithm>
using namespace std;
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int T;
    cin >> T;
    while(T--){
        int n, m;
        cin >> n >> m;
        vector<string> rounds(n);
        for (int i = 0; i < n; i++){
            cin >> rounds[i];
        }
        vector<long long> total(n+1, 0LL);
 
        for (int col = 0; col < m; col++){
            vector<int> prefix(n+1, 0);
            int freq[26] = {0};
            int currentMax = 0;
            for (int i = 1; i <= n; i++){
                char c = rounds[i-1][col];
                int idx = c - 'a';
                freq[idx]++;
                currentMax = max(currentMax, freq[idx]);
                prefix[i] = currentMax;
            }
 
            // suffix[i] = maximum frequency (in this column) among rounds i..n.
            vector<int> suffix(n+2, 0);  // suffix[n+1] = 0 (empty)
            memset(freq, 0, sizeof(freq));
            currentMax = 0;
            for (int i = n; i >= 1; i--){
                char c = rounds[i-1][col];
                int idx = c - 'a';
                freq[idx]++;
                currentMax = max(currentMax, freq[idx]);
                suffix[i] = currentMax;
            }
 
            // For each possible partition k (0 <= k <= n):
            // - Rounds 1..k use the guess-string chosen to maximize matches in that column (prefix part).
            // - Rounds k+1..n use a (possibly new) guess-string (suffix part).
            // So, add prefix[k] + suffix[k+1] to the total contribution for this column.
            for (int k = 0; k <= n; k++){
                total[k] += prefix[k] + suffix[k+1];
            }
        }
 
        // The answer is the maximum total score we can get over all possible partitions.
        long long ans = 0;
        for (int k = 0; k <= n; k++){
            ans = max(ans, total[k]);
        }
 
        cout << ans << "\n";
    }
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1164 Simple character matching game
Contest
Brain Booster #8
Language
C++17 (G++ 13.2.0)
Submit At
2025-02-17 16:32:54
Judged At
2025-02-17 16:32:54
Judged By
Score
100
Total Time
38ms
Peak Memory
1.438 MiB