[CodeForces510c]Fox And Names
Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the authors list on the paper is always sorted in the lexicographicalorder.
After checking some examples, she found out that sometimes it wasn't true. On some papers authors' names weren't sorted in lexicographical order in normal sense. But it was always true that after some modification of the order of letters in alphabet, the order of authors becomes lexicographical!
She wants to know, if there exists an order of letters in Latin alphabet such that the names on the paper she is submitting are following in the lexicographical order. If so, you should find out any such order.
Lexicographical order is defined in following way. When we compare s and t, first we find the leftmost position with differing characters: si ≠ ti. If there is no such position (i. e. s is a prefix of t or vice versa) the shortest string is less. Otherwise, we compare characters si and ti according to their order in alphabet.
The first line contains an integer n (1 ≤ n ≤ 100): number of names.
Each of the following n lines contain one string namei (1 ≤ |namei| ≤ 100), the i-th name. Each name contains only lowercase Latin letters. All names are different.
If there exists such order of letters that the given names are sorted lexicographically, output any such order as a permutation of characters 'a'–'z' (i. e. first output the first letter of the modified alphabet, then the second, and so on).
Otherwise output a single word "Impossible" (without quotes).
题意理解:有N个字符串,要求你给出一个字典序,使它们按字典序排序后的结果和输入顺序一样。
显然对于一个字符串i优先于字符串j,i的第一个和j不同的字母优于j的对应的字母。(若找不到该字母,即i是j的前面一部分则可以直接判断无解)
那么我们可以得到很多对字母之间的优先顺序,要给出26个字母的优先顺序,无非就是拓扑排序。
然后考虑,使用普通BFS的拓扑排序的时候,如果存在没有被拓扑排序所排序到的节点,那么无解(即有环)。
发现没有特殊情况。
因为点少,用邻接矩阵建图。
上代码
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<queue> using namespace std; char s[110][110],ans[30]; int in[110]; bool link[26][26]; queue<int>q; bool solve() { int cnt=0; for(int i=0;i<26;i++) { if(in[i]==0) { q.push(i); ans[cnt++]='a'+i; } } while(!q.empty()) { int now=q.front(); q.pop(); for(int i=0;i<26;i++) { if(link[now][i]) { in[i]--; if(in[i]==0) { q.push(i); ans[cnt++]='a'+i; } } } } ans[26]='\0'; if(cnt<26) return false; else return true; } int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>s[i]; bool flag=true; for(int i=0;i<n-1&&flag;i++) { bool ok=false; int l1=strlen(s[i]),l2=strlen(s[i+1]); for(int j=0;j<l1&&j<l2&&!ok;j++) { if(s[i][j]!=s[i+1][j]) { ok=true; if(!link[s[i][j]-'a'][s[i+1][j]-'a']) { in[s[i+1][j]-'a']++; link[s[i][j]-'a'][s[i+1][j]-'a']=true; } } } if(!ok&&l1>l2) flag=false; } if(!flag) { printf("Impossible\n"); } else { flag=solve(); if(!flag) printf("Impossible\n"); else printf("%s",ans); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人