zhao2008 @ 2024-02-05 13:55:58
RT
吐了 怎么卡空间?
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int n,m,tr[N][26],h[N],sum,idx;
string s,ans;
bool ed[N];char ch[N];
vector<int> e[N];
bool cmp(int x,int y){
return h[x]<h[y];
}
void insert(string s){
int len=s.size(),k=0,c;
for(int i=0;i<len;i++){
c=s[i]-'a';
if(tr[k][c]==0){
tr[k][c]=++idx;
e[k].push_back(idx),sum+=2;
}
ch[tr[k][c]]=s[i],k=tr[k][c];
}
ed[k]=1;
}
void dfs1(int k){
int mx=0;
for(int i=0;i<e[k].size();i++){
int v=e[k][i];
dfs1(v);
mx=max(mx,h[v]);
}
h[k]=mx+1;
}
void dfs2(int k){
if(ed[k]==1) ans+='P';
for(int i=0;i<e[k].size();i++){
int v=e[k][i];
ans+=ch[v];
dfs2(v);
ans+='-';
}
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n;sum=n;
for(int i=1;i<=n;i++){
cin>>s;
insert(s);
}
dfs1(0);
for(int i=0;i<=idx;i++)
sort(e[i].begin(),e[i].end(),cmp);
sum-=h[0]-1;
dfs2(0);
cout<<sum<<endl;
for(int i=0;i<sum;i++)
cout<<ans[i]<<endl;
return 0;
}
by syp11 @ 2024-04-03 13:06:07
@zhao2008 确实卡空间……我习惯用动态开点的线段树,所以把数组改成map去存子节点的指针,这样就卡进去了,不妨尝试一下
记录
by syp11 @ 2024-04-03 13:06:42
@syp11 错别字,应该是字典树……
by zhao2008 @ 2024-04-03 16:57:51
@syp11 谢谢!