首先建一个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