Codeforces Round #290 (Div. 2) C. Fox And Names 拓扑排序

input

3rivestshamiradleman

output

bcdefghijklmnopqrsatuvwxyz

input

10touristpetrwjmzbmryeputonsvepifanovscottwuoooooooooooooooosubscriberrowdarktankengineer

output

Impossible

input

10petregorendagorionfeferivanilovetanyaromanovakostkadmitriyhmaratsnowbearbredorjaguarturnikcgyforever

output

aghjlnopefikdmbcqrstuvwxyz

input

7carcarecarefulcarefullybecarefuldontforgetsomethingotherwiseyouwillbehackedgoodluck

output

acbdefhijklmnogpqrstuvwxyz题目给出一个字符串集,并假设是字典序的,要求26个字母的字典序(自定义的字典序),每两个字符串,可以得出一对字符的优先级,然后得出了所有字符的先后顺序,就转化成了拓扑排序的问题了,使用了优先队列,这样可以尽可能的小的在前面。其次,如果有ab a,,这样的字符串,可以直接认为是不可能存在的!#define N 105#define MOD 1000000000000000007struct node{int x;node(int xx){x = xx;}bool operator < (const node a) const{return x>a.x;}};int n,in[30],ans[30],ansNum;char str[N][N];bool land[30][30];priority_queue<node> myqueue;bool getland(int x,int y){int len = min(strlen(str[x]),strlen(str[y]));FI(len){if(str[x][i] != str[y][i]){land[str[x][i] – 'a'][str[y][i]-'a'] = true;return true;}}if(strlen(str[x])>strlen(str[y]))return false;return true;}int main(){while(S(n)!=EOF){FI(n){SS(str[i]);}memset(land,false,sizeof(land));bool flag = true;for(int i=0;i<n && flag;i++){for(int j = i+1;j<n && flag;j++){flag = getland(i,j);}}if(!flag){printf("Impossible\n");continue;}memset(in,0,sizeof(in));FI(26){FJ(26){if(land[i][j]){in[j]++;}}}while(!myqueue.empty())myqueue.pop();for(int i=0;i<26;i++){if(in[i] == 0){myqueue.push(node(i));}}ansNum = 0;while(!myqueue.empty()){node top = myqueue.top();myqueue.pop();ans[ansNum++] = top.x;FI(26){if(land[top.x][i]){in[i]–;if(in[i] == 0)myqueue.push(node(i));}}}if(ansNum == 26){FI(ansNum)printf("%c",ans[i]+'a');printf("\n");}elseprintf("Impossible\n");}return 0;}

心有多大,舞台就有多大。

Codeforces Round #290 (Div. 2) C. Fox And Names 拓扑排序

相关文章:

你感兴趣的文章:

标签云: