【链接】 我是链接,点我呀:)

【题意】

给你n个字符串。
让你构造一个字符串s。
使得这n个字符串。
每个字符串都是s的子串。
且都是出现次数最多的子串。
要求s的长度最短,且s的字典序最小。

【题解】

如果s是出现最多的子串。
那么s的任意一个子串也都是出现次数最多的子串。
那么考虑"ab"这样一个子串。
则肯定要有字符'a'后面接的一定是'b'
且字符'b'前接的一定是'a'
不然'a'或'b'的出现次数一定会大于"ab"了。
则对于任意一个字符串s,在s[i]和s[i+1]之间建立一条有向边,s[i]->s[i+1];
这就是一个类似拓扑排序的题了。
(如果没办法做拓扑排序,则无解
但是有一定要求。
即每个点的出度和入度一定要是1.
否则,如果有a->b,c->b这种情况。
拓扑排序救过是acb,但是没办法满足a后面紧跟着b.
还有a->c,a->b这种也显然不行,也没办法两者都满足。
然后要优先拓扑有边的点。
比如
"c"
"bd"
则b进入答案之后,下一个应该拓扑的是d而不是"c",因为d是要紧跟在b后面的1

【代码】

#include <bits/stdc++.h>
using namespace std; int n;
string s;
bool bo[300];
int a[300][300],rd[300],cd[300],tot = 26;
int inq[300],special;
queue <int> dl;
string ans = ""; int main(){
#ifdef LOCAL_DEFINE
freopen("F:\\c++source\\rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
cin >> n;
for (int i = 1;i <= n;i++){
cin >> s;
int len = s.size();
for (int j = 0;j < len;j++) bo[(int)s[j]] = true;
for (int j = 0;j < len-1;j++){
if (a[(int)s[j]][(int)s[j+1]]==0) {
rd[(int)s[j+1]]++;
cd[(int) s[j]]++;
}
a[(int)s[j]][(int)s[j+1]] = 1;
}
} for (int key = 'a';key <= 'z';key++)
if (!bo[key]){
rd[key] = cd[key] = -1;
tot--;
} for (int key = 'a';key <= 'z';key++)
if (rd[key]==0){
inq[key] = 1;
rd[key] = -1;
if (cd[key] > 1) return cout <<"NO"<<endl,0;
}else {
if (rd[key]>1 || cd[key] >1) return cout <<"NO"<<endl,0;
} special = 0;
while (1){
int x = -1;
if (special!=0) x = special;
for (int key = 'a';x==-1 && key <= 'z';key++)
if (inq[key]){
x = key;
break;
}
if (x==-1) break;
tot--;
inq[x] = 0;
if (special==x) special = 0;
ans += (char) x;
for (int i = 'a';i <= 'z';i++){
if (a[x][i]){
rd[i]--;
a[x][i] = 0;
if (rd[i]==0){
special = i;
inq[i] = 1;
rd[i] = -1;
}else{
return cout <<"NO"<<endl,0;
}
}
}
} if (tot!=0){
cout <<"NO"<<endl;
}else{
cout << ans << endl;
}
return 0;
}

最新文章

  1. js创建,获取,检测cookie
  2. poj2631 求树的直径裸题
  3. [linux系统]查看内核版本和系统版本方法
  4. windows 安装oracle 后,所有服务都是什么意思,需要开户吗?
  5. oracle ebs request一直pending
  6. 【BZOJ】【1019】【SHOI2008】汉诺塔
  7. Jquery CheckBox复选框 全选/取消全选 最佳实现方式 参考案例
  8. ganglia单播配置
  9. P神的SDFZ考试题 C题
  10. python学习之路前端-jQuery
  11. Spring事务管理与数据库隔离级别的关系(Spring+mysql)
  12. Linux新手随手笔记1.7
  13. linux设置环境变量(这里以hive为例给大家举例)
  14. 【CF471E】MUH and Lots and Lots of Segments 扫描线+并查集+线段树+set
  15. 【PAT】B1084 外观数列(20 分)(纯C)
  16. JS中的兼容问题总结
  17. 校验IPv4和IPv6地址和URL地址
  18. instance method &#39;*****&#39; not found (return type defaults to &#39;id&#39;)
  19. Java序列化的机制和原理 转
  20. HTTP 1.1 协议规范

热门文章

  1. SQL char字段类型排序
  2. js实现table排序(jQuery下的jquery.sortElements)
  3. J2SE基础:2.对象的创建与使用
  4. Hadoop-2.6.0上的C的API訪问HDFS
  5. 关于命令行签名时.SF和.RSA文件的命名问题
  6. C# 爬虫总结
  7. java使double保留两位小数的多方法
  8. 【CS Round #39 (Div. 2 only) D】Seven-segment Display
  9. 【CS Round #39 (Div. 2 only) C】Reconstruct Sum
  10. 【D3 API 中文手冊】