Day2T2 分配笔名//CF566A

首先建一个Trie,考虑贪心选深层节点合并。

#include<bits/stdc++.h>
#define fr(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int N=2e6+5;
int n,p=1;
int ch[N][26],cnt[N][2];
long long ans;
inline void insert(char *a,int v){
    int u=1;
    fr(i,0,strlen(a)-1){
        int c=a[i]-'a';
        if(!ch[u][c])ch[u][c]=++p;
        u=ch[u][c];
    }
    ++cnt[u][v];
}
inline void dfs(int u,int dep){
    fr(i,0,25){
        if(ch[u][i])dfs(ch[u][i],dep+1);
        cnt[u][0]+=cnt[ch[u][i]][0];
        cnt[u][1]+=cnt[ch[u][i]][1];
    }
    int k=min(cnt[u][0],cnt[u][1]);
    ans+=1ll*k*dep;
    cnt[u][0]-=k;cnt[u][1]-=k;
}
char a[N];
int main(){
    scanf("%d",&n);
    fr(i,1,n)cin>>a,insert(a,0);
    fr(i,1,n)cin>>a,insert(a,1);
    dfs(1,0);
    cout<<ans<<endl;
}

如果要求输出方案呢?

即是CF566A

猜你喜欢

转载自www.cnblogs.com/coder-cjh/p/11628425.html