洛谷 P11226 [COTS 2019] 排名

题目传送门

根据字典序的定义,要比较两个字符串的字典序大小,仅需比较它们公共前缀的后一位。可以用 trie 维护字符串集。

根据目标队名,可以得到一些字符的关系。利用这些关系建一张有向图 G,在上面拓扑排序判断即可。时间复杂度 O(L||)

点击查看代码
const int N=3e4+8,L=1e6+8;
int n;
string str[N];
int trie[L][27],ocnt;
bool edtag[L];
void insert(string s){
	int o=0;
	for(int i=0;i<(int)s.size();i++){
		int ch=s[i]-'a';
		if(trie[o][ch]==0)
			trie[o][ch]=++ocnt;
		o=trie[o][ch];
	}
	edtag[o]=1;
}
int indeg[27];
vector<int> G[27];
void solve(int id){
	for(int i=0;i<26;i++){
		indeg[i]=0;
		G[i].clear();
	}
	int o=0;
	bool flg=1;
	for(int i=0;i<(int)str[id].size();i++){
		int ch=str[id][i]-'a';
		if(edtag[o]==1){
			flg=0;
			break;
		}
		for(int u=0;u<26;u++){
			if(trie[o][u]==0||u==ch)
				continue;
			G[ch].push_back(u);
			indeg[u]++;
		}
		o=trie[o][ch];
	}
	if(flg==0){
		cout<<"nemoguce\n";
		return;
	}
	string ans;
	queue<int> que;
	for(int u=0;u<26;u++)
		if(indeg[u]==0)
			que.push(u);
	while(que.empty()==0){
		int u=que.front();
		que.pop();
		ans+=char(u+'a');
		for(int v:G[u]){
			indeg[v]--;
			if(indeg[v]==0)
				que.push(v);
		}
	}
	if((int)ans.size()==26)
		cout<<ans<<'\n';
	else
		cout<<"nemoguce\n";
}
void MAIN(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>str[i];
		insert(str[i]);
	}
	for(int i=1;i<=n;i++)
		solve(i);
}
posted @   Irotan  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示