72分TLE求助

P4683 [IOI2008] Type Printer

maoxiaoben @ 2024-05-12 18:26:21

代码如下,不知道还可以优化哪里

 #include<bits/stdc++.h>
using namespace std;
int n,cur=0,step=1,tr[500010][26];
char d[500010];
bool mo[500010],fla[500010],flag=false;
string ans,maxs;
void shu(string s)
{
    int fu=0;
    for(int i=0;i<s.size();++i)
    {
        int t=s[i]-'a';
        if(tr[fu][t]==0)tr[fu][t]=++cur;
        d[tr[fu][t]]=char(t+'a');
        fu=tr[fu][t];
    }
    mo[fu]=true;
}
void mark(string s)
{
    int fu=0;
    for(int i=0;i<s.size();++i)
    {
        int t=s[i]-'a';
        fla[tr[fu][t]]=true;
        fu=tr[fu][t];
    }
}
void dfs(int mao)
{
    if(mo[mao])
    {
        ++step;
        ans=ans+'P';
    }
    if(step>n)
    {
        cout<<ans.size()<<endl;
        for(int i=0;i<ans.size();++i)cout<<ans[i]<<endl;
        exit(0);
    }
    int x,tmp=-1;
    for(int i=0;i<26;++i)
    {
        x=tr[mao][i];
        if(fla[x])tmp=x;
        if(x!=0&&!fla[x])
        {
            ans=ans+d[x];
            dfs(x);
        }
    }
    if(tmp!=-1)
    {
        ans=ans+d[tmp];
        dfs(tmp);
    }
    if(tmp==-1&&fla[mao])flag=true;
    if(!flag) ans=ans+'-';
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;++i)
    {
        string s;
        cin>>s;
        shu(s);
        if(s.size()>maxs.size())maxs=s;
    }
    mark(maxs);
    dfs(0);
    return 0;
}

|