Submission #1294573

#TimeUsernameProblemLanguageResultExecution timeMemory
1294573ThunnusVještica (COCI16_vjestica)C++20
160 / 160
65 ms840 KiB
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
//#define int i64
#define vi vector<int>
#define vvi vector<vi>
#define vb vector<bool>
#define se second
#define fi first
#define pii pair<int, int>
#define sz(x) (int)(x).size()

const int ABC = 26;
const int INF = 1e9 + 3;

inline void solve(){
    int n;
    cin >> n;
    vvi cnt(n, vi(ABC + 1));
    vi dp2(1 << n, INF);
    for(int i = 0; i < n; i++){
        string s;
        cin >> s;
        for(int j = 0; j < sz(s); j++){
            cnt[i][s[j] - 'a']++;
        }
        dp2[1 << i] = cnt[i].back() = sz(s);
    }

    vi dp(1 << n);
    for(int mask = 1; mask < (1 << n); mask++){
        // same common prefix
        vi mx(ABC, -1);
        for(int bit = 0; bit < n; bit++){
            if((mask >> bit) & 1){
                for(int j = 0; j < ABC; j++){
                    if(mx[j] == -1 || cnt[bit][j] < mx[j]){
                        mx[j] = cnt[bit][j];
                    }
                }
            }
        }
        for(int j = 0; j < ABC; j++){
            if(mx[j] != -1){
                dp[mask] += mx[j]; // length of maximum common prefix
            }
        }
    }
    for(int mask = 1; mask < (1 << n); mask++){
        for(int ss = mask & (mask - 1); ss; ss = (ss - 1) & mask){
            dp2[mask] = min(dp2[mask], dp2[ss] + dp2[mask ^ ss] - dp[mask]); // splitlemeden önceki prefiximi splitlediğim her iki subtreemde de sayıyorum
        }
    }

    cout << dp2[(1 << n) - 1] + 1 << "\n";
    return;
}

signed main(){
    ios_base::sync_with_stdio(false); cin.tie(0);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...