11分求助

P4683 [IOI2008] Type Printer

lpx2024 @ 2023-10-05 16:56:47

样例过了

#include <bits/stdc++.h>
using namespace std;
const int maxN=1000000;
int n,cnt,trie[maxN][26],ed[maxN],f[maxN];
char c[maxN];
string s1="";
void Insert(string s){
    int t=0;
    for(int i=0;i<s.size();i++){
        int p=s[i]-'a';
        if(s==s1) f[t]=p;
        if(!trie[t][p]) trie[t][p]=++cnt;
        t=trie[t][p];
    }
    ed[t]++;
}
void dfs(int x){
    for(int i=0;i<26;i++){
        if(!trie[x][i] || f[x]==i) continue;
        c[++cnt]=i+'a';
        dfs(trie[x][i]);
        if(!n) return;
        c[++cnt]='-';
    }
    if(f[x]){
        c[++cnt]=f[x]+'a';
        dfs(trie[x][f[x]]);
        if(!n) return;
        c[++cnt]='-';
    }
    for(int i=1;i<=ed[x];i++) c[++cnt]='P',n--;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        if(s.size()>s1.size()) s1=s;
        Insert(s);
    }
    cnt=0;
    dfs(0);
    cout<<cnt<<endl;
    for(int i=1;i<=cnt;i++) cout<<c[i]<<endl;
    return 0;
}

|