社区讨论

90分,点#3,与一个问题

P4290[HAOI2008] 玩具取名参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@locdyiw6
此快照首次捕获于
2023/10/30 12:14
2 年前
此快照最后确认于
2023/11/04 23:55
2 年前
查看原帖
排查了好几遍,找不到问题。。。 等一个大佬
CPP
#include <cstdio>
#include <cstring>

const int MAXN = 202;

int w,i,n,g;

bool r[4][4][4] = {false};
char s[MAXN];
int a[MAXN];
int N;

inline int tr(char c){
	if(c == 'W') return 0;
	if(c == 'I') return 1;
	if(c == 'N') return 2;
	if(c == 'G') return 3;
}
inline void ipt(int n,int n1){
	for(int i = 1; i <= n ; i ++){
		char c = getchar();
		char c2 = getchar();
		getchar();
		//printf("|%c|%c|\n",c,c2);
		r[tr(c)][tr(c2)][n1] = true;
		//r[tr(c2)][tr(c)][n1] = true;
	}
}

bool f[MAXN][MAXN][4] = {false};

int main()
{
	scanf("%d%d%d%d",&w,&i,&n,&g);
	
	getchar();
	
	
	ipt(w,0);
	ipt(i,1);
	ipt(n,2);
	ipt(g,3);
	
	scanf("%s",s);
	int N = strlen(s);
	for(int i = 0 ; i < N ; i ++){
		a[i+1] = tr(s[i]);
	}
	f[1][1][a[1]] = true;
	for(int i = 2; i <= N ; i++){//预处理 
		f[i][i][a[i]] = true;
		for(int j = 0 ; j <4 ; j++){
			if(r[a[i-1]][a[i]][j] == false) continue;
			f[i-1][i][j] = true;
		}
	}
	
	for(int i = 1; i <= N ; i ++){
		for(int j = i+2;j <= N; j ++){
			for(int k = i; k < j ; k++){
				for(int l = 0 ; l < 4 ; l++){
					for(int m = 0 ; m < 4; m++){
						for(int q = 0 ; q < 4 ; q++){
							
							if(f[i][k][m] == false || f[k+1][j][q] == false || r[m][q][l] == false) continue; 
							f[i][j][l] = true;
						}
					}
				}
			}
		}
	}
	
	int cnt = 0;

	if(f[1][N][0] == true) { printf("W"); cnt++;}
	if(f[1][N][1] == true) {printf("I"); cnt++;}
	if(f[1][N][2] == true) {printf("N"); cnt++;}
	if(f[1][N][3] == true) {printf("G"); cnt++;}

	if(cnt == 0) printf("The name is wrong!");
	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...