也许是我题目没有理解清楚?
第一个测试点显示排序后第一个串位置不正确,下面是数据:
5
ffbcd
abaa
fabbf
fa
abfa
1 4 3 5 2
然后我的程序输出是这样的:
DA
bcdefghijklmnopqrstuvwxyza
我认为这个数据只要满足 f 在 a 前面就行了。恳求大佬解答。
#include<bits/stdc++.h>
using namespace std;
int n,trie[10010][26],num[10010],tot=1,a[5200010],b[5200010],Rd[5200010],flag[5200010];
vector<int>e[5200010];
string s[520];
inline void add(string t,int id,int now=1){
for(char i : t){
int to=i-'a';
if(!trie[now][to])trie[now][to]=++tot;
now=trie[now][to];num[now]++;
}flag[now]=max(flag[now],b[id]);
}
inline void check(string t,int id,int now=1){
for(int i=0;i<t.size()-1;i++){
int to=t[i]-'a';now=trie[now][to];
if(flag[now]>b[id]){
cout<<"NE";exit(0);
}
}
}
inline void build(string t,int now=1){
for(char i : t){
int to=i-'a';
for(int j=0;j<26;j++){
if(j==to||!num[trie[now][j]])continue;
e[to].emplace_back(j);Rd[j]++;
}
now=trie[now][to];num[now]--;
}
}
string ans;
inline void query(){
queue<int>q;
for(int i=0;i<26;i++)if(!Rd[i])q.push(i);
while(!q.empty()){
int x=q.front();ans+=x+'a';q.pop();
for(int v : e[x]){
Rd[v]--;if(!Rd[v])q.push(v);
}
}
if(ans.size()==26)cout<<"DA\n"<<ans;
else cout<<"NE";
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>s[i];
for(int i=1;i<=n;i++){cin>>a[i];b[a[i]]=i;}
for(int i=1;i<=n;i++)add(s[i],i);
for(int i=1;i<=n;i++)check(s[i],i);
for(int i=1;i<=n;i++)build(s[a[i]]);
query();
}
/*
aa***
b*bb
ab**a
ab
b*ab
5
ffbcd
abaa
fabbf
fa
abfa
1 4 3 5 2
*/