1084: 最长公共子序列Ⅱ
这道题目应该是hard
要掌握枚举一个字符串中长度小于等于len的所有子序列,需要使用位运算
使用legal来保存第i个字符串(不包括本身)以前所有的公共子序列,再用temp来存储包括第i个字符串的所有公共子序列,
然后用legal = temp来更新legal,并记得对temp清空
#include <bits/stdc++.h>
using namespace std;
string s,ans;
unordered_map <string,bool> legal,temp;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
ans.clear();
for( int i = 0;i<n;i++)
{
cin>>s;
string box;
int len = s.size(),tp = (1<<len);
s +=s;
// cout<<s<<endl;
for (int l=0;l<len;l++){
for(int j=1;j<tp;j++){
for(int k=0;k<len;k++){
if(j&(1<<k)){
box.push_back(s[l+k]);
}
}
if(i==0||legal.count(box)){
temp[box]=1;
}
box.clear();
}
}
legal.clear();
legal = temp;
temp.clear();
if(i==n-1){
for(auto it =legal.begin();it !=legal.end();it++){
if( ans.size()< it->first.size()){
ans =it->first;
}
else if(ans.size() == it->first.size()&&ans>it->first)
ans =it->first;
}
}
}
if(ans.size()==0){
printf("0\n");
}else{
cout<<ans<<endl;
}
}
return 0;
}

浙公网安备 33010602011771号