• CF510c Fox And Names


    简单地说,就是给出一张名字的列表,要找到一张字母表使得这张人名的列表是按字典序排列的。

    这不就是今年天梯赛的原题嘛?

    拓扑排序没的说

    需要注意的点:可能存在前缀相等但是长度不等 判断possible或者impossible的时候这种情况非常容易忽略

    再就是如果拓扑排序存在环 也就是最后仍然存在度数不为0的点

    #include<bits/stdc++.h>
    using namespace std;
    #define lowbit(x) x&(-x)
    #define ll long long
    const int maxn=105;
    int n,cnt,tot;
    map<char,int>mp;
    map<int,char>rk;
    vector<int>Q[maxn];
    queue<int>QQ;
    int du[maxn];
    bool flag;
    char ans[maxn];
    string s[maxn];
    void add(int u,int v){
    	Q[u].push_back(v);
    	du[v]++;
    }
    void calc(string,string);
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	cin>>s[i];
    	for(int i=2;i<=n;i++)
    	calc(s[i-1],s[i]);
    	for(int i=1;i<=cnt;i++)
    	if(!du[i])QQ.push(i);
    	while(!QQ.empty()){
    		int u=QQ.front();
    		QQ.pop();ans[++tot]=rk[u];
    		for(int i=0;i<Q[u].size();i++){
    			int to=Q[u][i];
    			du[to]--;
    			if(!du[to])QQ.push(to);
    		}
    	}
    	if(tot!=cnt||flag)cout<<"Impossible";
    	else {
    		for(char i='a';i<='z';i++)
    		if(!mp.count(i))
    		ans[++tot]=i;
    		for(int i=1;i<=tot;i++)cout<<ans[i];
    	}
         return 0;
    }
    void calc(string a,string b){
    	int len=min(a.size(),b.size());
    	bool cmp=1;
    	for(int i=0;i<len;i++){
    		if(a[i]!=b[i]){
    			if(!mp.count(a[i]))mp[a[i]]=++cnt,rk[cnt]=a[i];
    			if(!mp.count(b[i]))mp[b[i]]=++cnt,rk[cnt]=b[i];
    			add(mp[a[i]],mp[b[i]]);
    			cmp=0;
    			break;
    		}
    	}
    	if(cmp==1&&a.size()>b.size())flag=1;
    }
    
  • 相关阅读:
    结对-五子棋-测试过程
    结队-五子棋游戏-项目进度
    团队-象棋游戏-代码设计规范
    团队-象棋游戏-开发环境搭建过程
    课后作业-阅读任务-阅读提问-1
    20170914-构建之法:现代软件工程-阅读笔记
    结对-五子棋游戏-开发环境搭建过程
    团队-象棋-成员简介及分工
    结对-五子棋-需求分析
    个人-GIT使用方法
  • 原文地址:https://www.cnblogs.com/wzxbeliever/p/16281575.html
Copyright © 2020-2023  润新知