88分MLE求助!

P4683 [IOI2008] Type Printer

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 谢谢!


|