72分TLE求助
查看原帖
72分TLE求助
1054230
maoxiaoben楼主2024/5/12 18:26

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

#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;
}
2024/5/12 18:26
加载中...