题目描述
PIPI又来刁难胖虎了~
现在PIPI有n个字符串项链,它要你求出这n个环的最长公共子序列,并输出~
PS:注意每个字符串都成环了,首尾相连~
输入
多组数据
第一行为一个整数n,1<=n<=10
接下来n行,每行一个字符串,保证字符串长度不超过8.
输出
输出一个字符串,代表n个串的最长公共子序列。若不存在,输出0.若有多个答案,输出字典序最小的。
样例输入
2
abcdefg
zaxcdkgb
5
abcdef
kedajceu
adbac
abcdef
abcdafc
2
abc
def
样例输出
acdg
acd
0
题解代码如下
#include<bits/stdc++.h>
using namespace std;
string s,ans;
unordered_map<string,bool> legal,tmp; ///legal存目前为止合法的子序列,tmp存当前串产生的合法子序列
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
ans.clear();
cin >> s;
string box; ///存选出来的子序列
tmp.clear();
int len = s.size(),tp = 1 << len;
s += s; ///字符串扩充一倍,可以直接往后面读字符串
for(int l = 0;l < len;l ++){ ///枚举起点
for(int j = 1;j < tp;j ++){ ///枚举1~2^n-1的所有数字
for(int k = 0;k < len;k ++){
if(j&(1<<k)) box.push_back(s[l+k]);
}
if(i == 0 || legal.count(box)) tmp[box] = 1;
box.clear();
}
}
if(i == n-1){ ///现在处理到最后一个字符串
for(auto it = tmp.begin();it != tmp.end();++ it){
if(ans.size()<it->first.size()) ans = it->first;
else if(ans.size() == it->first.size()&&ans>it->first) ans = it->first;
}
}else{
legal.clear();
for(auto it = tmp.begin();it != tmp.end();++it) legal[it->first] = 1;
}
}
if(ans.size()==0) puts("0");
else cout << ans <<endl;
}
}