2020牛客多校七 J. Pointer Analysis (暴力)

题意:在这里插入图片描述
在这里插入图片描述

题解:暴力
题目有点难理解,第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;  
}

猜你喜欢

转载自blog.csdn.net/qq_43680965/article/details/107743465
今日推荐