题意:
题解:暴力
题目有点难理解,第1、2种操作就是赋值。
比如 A = B.f ,B.f 说的是 B 指向的对象(所以要判断B是否为空)的成员变量 f ,而这个成员变量 f 指向了另一个对象,与 B 是无关的,搞个三维数组,然后进行赋值。A.f = B 反过来写就是了。
无限次执行的话,n次就够了。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
int n, ans[30][30], a[30][30][30];
char s1[222][5], s2[222][5];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%s%s%s", s1[i] + 1, s2[i] + 1, s2[i] + 1);
int T = n;
while (T--) {
for (int i = 1; i <= n; i++) {
int l1 = strlen(s1[i] + 1);
int l2 = strlen(s2[i] + 1);
int c1 = s1[i][1] - 'A';
int c2 = s2[i][1] - 'A';
if (l1 == l2) {
if (s2[i][1] >= 'a') ans[c1][s2[i][1] - 'a'] = 1;
else for (int j = 0; j < 26; j++) ans[c1][j] |= ans[c2][j];
}
else if (l2 >= 3) {
int c3 = s2[i][3] - 'a'; //c3是成员
for (int j = 0; j < 26; j++) {
//j是对象
if (ans[c2][j]) {
//k是第二层对象
for (int k = 0; k < 26; k++) ans[c1][k] |= a[c3][j][k];
}
}
}
else {
int c3 = s1[i][3] - 'a';
for (int j = 0; j < 26; j++) {
if (ans[c1][j]) {
for (int k = 0; k < 26; k++) a[c3][j][k] |= ans[c2][k];
}
}
}
}
}
for (int i = 0; i < 26; i++) {
printf("%c: ", 'A' + i);
for (int j = 0; j < 26; j++) if (ans[i][j]) printf("%c", 'a' + j);
puts("");
}
return 0;
}