洛谷 P11226 [COTS 2019] 排名
根据字典序的定义,要比较两个字符串的字典序大小,仅需比较它们公共前缀的后一位。可以用 trie 维护字符串集。
根据目标队名,可以得到一些字符的关系。利用这些关系建一张有向图
点击查看代码
const int N=3e4+8,L=1e6+8;
int n;
string str[N];
int trie[L][27],ocnt;
bool edtag[L];
void insert(string s){
int o=0;
for(int i=0;i<(int)s.size();i++){
int ch=s[i]-'a';
if(trie[o][ch]==0)
trie[o][ch]=++ocnt;
o=trie[o][ch];
}
edtag[o]=1;
}
int indeg[27];
vector<int> G[27];
void solve(int id){
for(int i=0;i<26;i++){
indeg[i]=0;
G[i].clear();
}
int o=0;
bool flg=1;
for(int i=0;i<(int)str[id].size();i++){
int ch=str[id][i]-'a';
if(edtag[o]==1){
flg=0;
break;
}
for(int u=0;u<26;u++){
if(trie[o][u]==0||u==ch)
continue;
G[ch].push_back(u);
indeg[u]++;
}
o=trie[o][ch];
}
if(flg==0){
cout<<"nemoguce\n";
return;
}
string ans;
queue<int> que;
for(int u=0;u<26;u++)
if(indeg[u]==0)
que.push(u);
while(que.empty()==0){
int u=que.front();
que.pop();
ans+=char(u+'a');
for(int v:G[u]){
indeg[v]--;
if(indeg[v]==0)
que.push(v);
}
}
if((int)ans.size()==26)
cout<<ans<<'\n';
else
cout<<"nemoguce\n";
}
void MAIN(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>str[i];
insert(str[i]);
}
for(int i=1;i<=n;i++)
solve(i);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】