题目大意

指针分析旨在确定在执行过程中可以通过程序中的特定指针变量访问哪些对象,这是静态程序分析的基本部分之一。 现在,我们希望您对测试数据执行上下文无关的指针分析。

一个程序包含26个用小写字母表示的object,每个object也有26个用小写字母表示的成员变量(也称fields,是指向某个object的指针),和26个用大写字母表示的全局指针。

程序有4种语句,用[Variable]表示指针的名称,[Field]表示成员变量的名称,[Object]表示对象。
图片说明

说人话

一个程序中有26个对象,每个对象有26个成员指针变量,同时还有26个普通的指针变量,给定n条赋值语句,询问在以任意顺序执行每条语句无限次的过程中,每个指针变量可能指向的对象集合。

一些指针参考:
https://www.runoob.com/cplusplus/cpp-pointers.html
https://blog.csdn.net/weixin_39951988/article/details/87773322
https://www.cnblogs.com/aquester/p/11469872.html

解题思路

定义?做法?输出?直接暴力。关键在于在输入后的处理。我们用b数组来记录每个,进行26*2=54次循环,每次从1到n,暴力判断求解就完事了。
(不知道怎么描述这种思路.jpg)

AC代码

#include <bits/stdc++.h>
using namespace std;
int a[30][30][30],b[30][30];
char l[210][60],r[210][60];
int main()
{
    int n,h,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%s = %s",l[i]+1,r[i]+1);
    for(h=1;h<=52;h++)
        for(i=1;i<=n;i++)
        {
            if(strlen(l[i]+1)==1 && strlen(r[i]+1)==1)
            {
                if('a'<=r[i][1] && r[i][1]<='z')
                    b[l[i][1]-'A'][r[i][1]-'a']=1;
                else
                {
                    for(j=0;j<26;j++)
                        if(b[r[i][1]-'A'][j])
                            b[l[i][1]-'A'][j]=1;
                }
            }
            else if(strlen(l[i]+1)==3 && strlen(r[i]+1)==1)
            {
                for(j=0;j<26;j++)
                    if(b[l[i][1]-'A'][j])
                        for(k=0;k<26;k++)
                            if(b[r[i][1]-'A'][k])
                                a[j][l[i][3]-'a'][k]=1;
            }
            else
            {
                for(j=0;j<26;j++)
                    if(b[r[i][1]-'A'][j])
                        for(k=0;k<26;k++)
                            if(a[j][r[i][3]-'a'][k])
                                b[l[i][1]-'A'][k]=1;
            }
        }
    for(i=0;i<26;i++)
    {
        printf("%c: ",'A'+i);
        for(j=0;j<26;j++)
            if(b[i][j])
                printf("%c",'a'+j);
        puts("");
    }
}