有 r 行 c 列的矩阵,每个格子里有一个大写字母。
有 n 次操作,每次操作是一行字符串 x is y,其中 x,y 都是大写字母,表示将矩阵中所有 x 替换成 y。
给出 r,c 以及矩阵,再给出 n 以及具体操作。
求能不能通过有限次次 x is y 操作使得新矩阵还原为原矩阵,如果可以输出 YES,否则输出 NO。
如果可以,第二行输出需要的次数 k,接下来 k 行,每行输出一个实际操作。
如果有多种可行解,输出其中一种即可,不需要使 k 最小化。
1≤r∗c≤105,1≤n≤104。
样例输入:
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;
}