J.Pointer Analysis(模拟)

思路:模拟,多次循环暴力所有情况,具体看代码。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=26+5,M=205,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
int tmp[N][N][N],g[N][N],n,loop=52;
char s[M][N<<1],t[M][N<<1];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s%*s%s",s[i],t[i]);
while(loop--){
for(int i=1;i<=n;i++){
if(strlen(s[i])==1&&strlen(t[i])==1){
if(islower(t[i][0])) //操作1 A=x
g[s[i][0]-'A'][t[i][0]-'a']=1;
else for(int j=0;j<26;j++) //操作2 A=B
if(g[t[i][0]-'A'][j]) g[s[i][0]-'A'][j]=1;
}
else if(strlen(s[i])==3&&strlen(t[i])==1){ //操作3 A.f=B
for(int j=0;j<26;j++)
if(g[s[i][0]-'A'][j]) //A可达的所有对象j
for(int k=0;k<26;k++) //B可达的所有对象k
if(g[t[i][0]-'A'][k])
tmp[j][s[i][2]-'a'][k]=1;
//A可达对象j的特定成员变量s[i][3] 能指向k
}
else {
for(int j=0;j<26;j++) //操作4 A=B.f
if(g[t[i][0]-'A'][j]) //B可达对象j的特定成员变量t[i][2]
for(int k=0;k<26;k++) //如果能指向对象k
if(tmp[j][t[i][2]-'a'][k])
g[s[i][0]-'A'][k]=1; //则A能指向k
}
}
}
for(int i=0;i<26;i++){
printf("%c: ",'A'+i);
for(int j=0;j<26;j++)
if(g[i][j])putchar(j+'a');
putchar('\n');
}
}