Sol.CF510C

其实是一道板子题,建议评黄

题意

求一种满足让\(n\)个字符串合法排列的字典序。

思路

不难想到使用拓扑排序。

具体地说,我们可以把字符串当作点,若有两个字符串 \(s1,s2\) 且满足 \(s1\) 的字典序小于 \(s2\) ,则建一条从 \(s1\)\(s2\) 的边。

注意到如果有两个字符串 \(s2\)\(s1\) 前缀且 \(s1\)\(s2\) 前面,那么无论如何改变字典序,同样的字符都是一样长的,而长的显然在后边,所以输出 Impossible

又注意到图有环也显然不可能,所以所以有环也输出 Impossible

最后放一段核心代码:

for(int i=1;i<=26;i++)if(cnt[i]==0)q.push(i);
while(!q.empty()){
	int head=q.front();
	ans[sum]=head;
	sum++;
	q.pop();
	for(int i=1;i<=cnt[head];i++){
	cnt[a[head][i]]--;
	if(!cnt[a[head][i]])
		q.push(a[head][i]);
	}		
}
posted @ 2023-09-12 19:25  JacoAwA  阅读(21)  评论(0)    收藏  举报