牛客多校7 - Pointer Analysis(模拟)

题目链接:点击查看

题目大意:给出指针与对象之间的赋值关系,求最后每个指针可能指向哪些对象,为了方便理解四种操作,提前在这里说一下,每个对象中是有 26 个变量的,这 26 个变量分别是 “对象指针” ,也是可以指向对象的,那么四种操作解释如下:

  1. A = x:A 指针指向对象 x
  2. A = B:A 指针指向指针 B 所指向的对象
  3. A.f = B:A 指针所指向的对象的 f 指针指向 B 指针所指向的对象
  4. 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;
}

猜你喜欢

转载自blog.csdn.net/qq_45458915/article/details/107754925