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;
} 
posted @ 2026-02-27 02:32  peter_shen  阅读(8)  评论(0)    收藏  举报