题目链接:点击查看
题目大意:给出指针与对象之间的赋值关系,求最后每个指针可能指向哪些对象,为了方便理解四种操作,提前在这里说一下,每个对象中是有 26 个变量的,这 26 个变量分别是 “对象指针” ,也是可以指向对象的,那么四种操作解释如下:
- A = x:A 指针指向对象 x
- A = B:A 指针指向指针 B 所指向的对象
- A.f = B:A 指针所指向的对象的 f 指针指向 B 指针所指向的对象
- A = B.f:A 指针指向 B 指针所指向的对象的 f 指针所指向的对象
题目分析:看懂题后直接模拟即可,大概模拟 n 次就过了
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int N=210;
char s1[N][5],s2[N][5];
int s[26][26][26];//s[对象][对象的指针][对象的指针的指针]
bool ans[26][26];//ans[指针][变量]
int n;
void solve()
{
for(int i=1;i<=n;i++)
{
int len1=strlen(s1[i]),len2=strlen(s2[i]);
if(islower(s2[i][0]))//A = x
{
ans[s1[i][0]-'A'][s2[i][0]-'a']=true;
}
else if(len1==1&&len2==1)//A = B
{
for(int j=0;j<26;j++)
ans[s1[i][0]-'A'][j]|=ans[s2[i][0]-'A'][j];
}
else if(len1==3)//A.f = B
{
for(int j=0;j<26;j++)//枚举A指针的对象
if(ans[s1[i][0]-'A'][j])//如果对象存在
for(int k=0;k<26;k++)//枚举对象的指针
s[j][s1[i][2]-'a'][k]|=ans[s2[i][0]-'A'][k];
}
else if(len2==3)//A = B.f
{
for(int j=0;j<26;j++)
if(ans[s2[i][0]-'A'][j])
for(int k=0;k<26;k++)
ans[s1[i][0]-'A'][k]|=s[j][s2[i][2]-'a'][k];
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("data.in.txt","r",stdin);
// freopen("data.out.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s%*s%s",s1[i],s2[i]);
for(int i=1;i<=n;i++)
solve();
for(int i=0;i<26;i++)
{
printf("%c: ",'A'+i);
for(int j=0;j<26;j++)
if(ans[i][j])
putchar('a'+j);
putchar('\n');
}
return 0;
}