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

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

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

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

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

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

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

1≤r∗c≤105,1≤n≤1041 \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
加载中...