求助一道模拟题
  • 板块学术版
  • 楼主andychen_2012
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/1/3 21:41
  • 上次更新2023/10/28 12:50:49
查看原帖
求助一道模拟题
389192
andychen_2012楼主2022/1/3 21:41

rrcc 列的矩阵,每个格子里有一个大写字母。

nn 次操作,每次操作是一行字符串 xx is yy,其中 x,yx,y 都是大写字母,表示将矩阵中所有 xx 替换成 yy

给出 r,cr,c 以及矩阵,再给出 nn 以及具体操作。

求能不能通过有限次次 xx is yy 操作使得新矩阵还原为原矩阵,如果可以输出 YESYES,否则输出 NONO

如果可以,第二行输出需要的次数 kk,接下来 kk 行,每行输出一个实际操作。

如果有多种可行解,输出其中一种即可,不需要使 kk 最小化。

1rc105,1n1041 \le r*c \le 10^5,1 \le n \le 10^4

样例输入:

3 4
AABB
BBCC
AABB
4
A is D
E is F
C is A
D is C

输出:

YES
3
A is E
C is A
E is C

我的程序是下面这个样子,样例是能过的,不知道错哪了:

#include<cstdio>
#include<cstring>
using namespace std;
int r,c;
int n;
bool h1[30],h2[30];
char s[200005];
char out[200005][10];
char c1[10005][3],op[3],c2[10005][3];
inline int ch(int x,int y){
	return x*c+y;
}
int main(){
	scanf("%d%d",&r,&c);
	for(int i=1;i<=r;++i){
		scanf("%s",s);
		for(int j=0;j<c;++j)
			h1[s[j]-'A'+1]=1;
	}
	for(int i=1;i<=26;++i)
		h2[i]=h1[i];
	scanf("%d",&n);
	bool flag=1;
	int k=n;
	while(n--){
		scanf("%s%s%s",c1[n],op,c2[n]);
		int a=c1[n][0]-'A'+1,b=c2[n][0]-'A'+1;
		if(h2[a]&&h2[b]&&a!=b){
			flag=0;
		}
		if(h2[a]&&!h2[b]&&a!=b){
			h2[b]=1;
			h2[a]=0;
		}
	}
	if(!flag){
		printf("NO");
		return 0;
	}
	printf("YES\n%d\n",k);
	for(int i=0;i<k;++i)
		printf("%c is %c\n",c2[i][0],c1[i][0]);
	return 0;
}
2022/1/3 21:41
加载中...