求优化,t了2个点
查看原帖
求优化,t了2个点
116011
sanye楼主2024/7/26 22:57

用的是区间dp

#include<bits/stdc++.h>
using namespace std;
string jichu[10][20];
string duibi="aa";
string base;
int a,b,c,d,pd;
char str[]={'W','I','N','G'};
bool check[210][210][10];
void find(int l,int r){
	for(int q=1;q<=a;q++){
		if(duibi==jichu[1][q]) check[l][r][1]=1;
	}
	for(int q=1;q<=b;q++){
		if(duibi==jichu[2][q]) check[l][r][2]=1;
	}
	for(int q=1;q<=c;q++){
		if(duibi==jichu[3][q]) check[l][r][3]=1;
	}
	for(int q=1;q<=d;q++){
		if(duibi==jichu[4][q]) check[l][r][4]=1;
	}
}
int main(){
	cin>>a>>b>>c>>d;
	for(int i=1;i<=a;i++) cin>>jichu[1][i];
	for(int i=1;i<=b;i++) cin>>jichu[2][i];
	for(int i=1;i<=c;i++) cin>>jichu[3][i];
	for(int i=1;i<=d;i++) cin>>jichu[4][i];
	cin>>base;
	int n=base.length();
	for(int i=2;i<=n;i++){
		for(int l=1;l<=n-i+1;l++){
			int r=l+i-1;
			for(int k=l;k<=r;k++){
				if(l==k&&k+1==r) {
					duibi[0]=base[l-1];
					duibi[1]=base[r-1];
					find(l,r);
				}
				else if(l==k){
					duibi[0]=base[l-1];
					for(int q=1;q<=4;q++){
						if(check[k+1][r][q]) {
							duibi[1]=str[q-1];
							find(l,r);
						}
					}
				}
				else if(k+1==r){
					duibi[1]=base[r-1];
					for(int q=1;q<=4;q++){
						if(check[l][k][q]) {
							duibi[0]=str[q-1];
							find(l,r);
						}
					}
				}
				else {
					for(int q=1;q<=4;q++){
						if(check[l][k][q]){
							duibi[0]=str[q-1];
							for(int qq=1;qq<=4;qq++){
								if(check[k+1][r][qq]){
									duibi[1]=str[qq-1];
									find(l,r);
								}
							}
						}
					}
				}
			}
		}
	}
	for(int i=1;i<=4;i++){
		if(check[1][n][i]){
			cout<<str[i-1];
			pd=1;
		}
	}
	if(!pd) cout<<"The name is wrong!";
}
2024/7/26 22:57
加载中...