ACM-ICPC 2018北京赛区网络预赛B (二进制枚举&最长公共子序列)&(set求交集)

#include<iostream>
#include<cstring>
#include<map>
using namespace std;
int n;
char s1[20],s2[20],s3[20],a[20][20],ans[20],aa[20],bb[20];
int dp[20][20],c[20],len[20];
void inition(){
	c[0]=1;
	for(int i=1;i<=10;i++)
		c[i]=c[i-1]*2;
}
int dpp(int l1,int l2){
	for(int i=0;i<l1;i++){
		aa[i]=s3[i];
	}
	for(int i=0;i<l2;i++){
		bb[i]=s2[i];
	}
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=l1;i++){			
		for(int j=1;j<=l2;j++){				
			if(aa[i-1]==bb[j-1]){					
				dp[i][j]=dp[i-1][j-1]+1;				
			}				
			else{					
				dp[i][j]=max(dp[i][j-1],dp[i-1][j]);				
			}			
		}		
	}
	if(dp[l1][l2]==l2)
		return 1;
	else
		return 0;
} 
int subset(int ll){
	int cnt=0;
	for(int i=2; i<=n; i++){
		int start=0;
		for(int ii=1;ii<=len[i];ii++){
			int k=0;
			for(int j=start;j<start+len[i];j++){
				s3[k++]=a[i][j];
//				cout<<s3[k]<<endl;
			}
			s3[k]='\0';
			start++;
//			cout<<s3<<endl;
			if(dpp(k,ll)){
				cnt++;break;
			}
		}
	}
	if(cnt==n-1)
		return 1;
	else 
		return 0;
}
int main(){
	inition();
//	map<int,int>q;
//	char a[15][10];
	while(cin>>n){
		for(int i=1;i<=n;i++){
			cin>>a[i];
			int l=strlen(a[i]);
			for(int j=0;j<l;j++){
				a[i][j+l]=a[i][j]; 
			}
			len[i]=l;
		}
//		for(int i=1;i<=n;i++){
//			cout<<a[i]<<endl;
//		}
//		for(int i=1;i<=n;i++){
//			cout<<len[i]<<endl;
//		}
		int st=0;
		memset(ans, '\0', sizeof(ans));
		for(int i=1;i<=len[1];i++){
			int k=0;
			for(int j=st;j<st+len[1];j++){
				s1[k++]=a[1][j];
			} 
			s1[k]='\0';
			st++;
//			cout<<s1<<endl;
			for(int ii=0;ii<c[len[1]];ii++){
				int kk=0;
				for(int jj=0;jj<len[1];jj++){
					if(ii&(1<<jj)) s2[kk++]=s1[jj];
				}
				s2[kk]='\0';
//				cout<<s2<<endl;
				if(subset(kk)){
					if(strlen(ans)<kk) 
						strcpy(ans,s2);
					else if(strlen(ans)==kk)
						if(strcmp(ans,s2)>0) 
							strcpy(ans,s2);
				}
			}
		}
		if(strlen(ans)>0)
			cout<<ans<<endl;
		else
			cout<<0<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/samscream/article/details/82864066