繁华模拟赛day8 字典序
Posted ACforever
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了繁华模拟赛day8 字典序相关的知识,希望对你有一定的参考价值。
/* 这个题要我们求一个字典序,字符串给出的顺序,会对字母的字典序前后相对顺序进行限定,如何用来表示这种限定,我们注意到这种一个之后接着一个,只有先输出他前面的才能输出他,很明显就是拓扑排序,最小方案只要优先队列随便搞一搞就行了 */ #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; const int maxn = 115; struct edge{ int v; int nxt; }e[maxn*50]; int n,l[maxn],ans[maxn],orz; int head[maxn],cnt,du[maxn]; char sb[maxn][maxn]; priority_queue< int , vector<int> , greater<int> > q; int read(){ char ch=getchar(); int x=0,f=1; while(!(ch>=\'0\'&&ch<=\'9\')){if(ch==\'-\')f=-1;ch=getchar();}; while(ch>=\'0\'&&ch<=\'9\'){x=x*10+(ch-\'0\');ch=getchar();}; return x*f; } void ins(int u,int v){ cnt++; e[cnt].v = v; e[cnt].nxt = head[u]; head[u] = cnt; } void build(){ int j; for(int i = 2;i <= n;i++){ j = 1; while(j <= l[i-1] && j <= l[i] && sb[i][j] == sb[i-1][j]) j++; if(j > l[i-1] || j > l[i] || sb[i][j] == sb[i-1][j]) continue; ins(sb[i-1][j]-\'a\',sb[i][j]-\'a\'); du[sb[i][j]-\'a\']++; } } bool topo(){ int u,to; for(int i = 0;i < 26;i++){ if(!du[i]) q.push(i); } while(!q.empty()){ ans[++orz] = q.top(); q.pop(); u = ans[orz]; for(int i = head[u];i;i=e[i].nxt){ to = e[i].v; du[to]--; if(!du[to]){ q.push(to); } } } return orz == 26; } int main(){ freopen("lexicographical.in","r",stdin); freopen("lexicographical.out","w",stdout); n = read(); for(int i = 1;i <= n;i++){ scanf("%s",sb[i]+1); l[i] = strlen(sb[i]+1); } build(); if(!topo()) cout<<"Impossible"; else{ for(int i = 1;i <= 26;i++){ char tmp = ans[i] + \'a\'; cout<<tmp; } } return 0; }
以上是关于繁华模拟赛day8 字典序的主要内容,如果未能解决你的问题,请参考以下文章