1084-最长公共子序列Ⅱ

题目描述
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值