Pointer Analysis【2020牛客多校第7场J题】【翻译+模拟】

题目链接


  好一篇阅读理解!——题记

  这题就是给你一个关于指针的定义。首先,有指针、成员、对象三个定义,这些与基础的C语言无差别。

  然后有四种操作:

  1. A = x:表示指针A指向成员x;
  2. A = B:表示指针A指向(指针B指向的所有的成员);
  3. A.f = B:表示指针A的全体成员的指针f指向(指针B指向的所有的成员);
  4. A = B.f:表示指针A指向(指针B的全体成员的指针f指向的成员)。

于是,现在问你,全局指针A~Z所可能指向的小写成员(小写字母)有哪些?升序输出。

为了方便理解,给出如下样例:

/*
4
A = a
B = a
B.f = A
C = A.f
ans:
A: a
B: a
C: a
*/

/*
3
A.a = A
B = A.a
A = c
ans:
A: c
B: c
*/

/*
5
A.a = C
B = c
B = C.a
C = d
A = x
ans:
A: x
B: c
C: d
*/

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
int N;
struct Question
{
    char s[3][5];
    void In() { scanf("%s%s%s", s[0], s[1], s[2]); }
} q[205];
bool ans[27][27], a[27][27][27];
inline bool small_char(char x) { return x >= 'a' && x <= 'z'; }
void solve()
{
    char l[5], r[5];
    for(int i=1; i<=N; i++)
    {
        memset(l, 0, sizeof(l));
        memset(r, 0, sizeof(r));
        strcpy(l, q[i].s[0]);
        strcpy(r, q[i].s[2]);
        if(l[1] ^ '.')
        {
            if(r[1] ^ '.')
            {
                if(small_char(r[0]))    //A = x
                {
                    ans[l[0] - 'A'][r[0] - 'a'] = true;
                }
                else    //A = B
                {
                    for(int j=0; j<26; j++) ans[l[0] - 'A'][j] |= ans[r[0] - 'A'][j];
                }
            }
            else    //A = B.f
            {
                for(int j=0; j<26; j++)
                {
                    if(ans[r[0] - 'A'][j])
                    {
                        for(int k=0; k<26; k++) ans[l[0] - 'A'][k] |= a[r[2] - 'a'][j][k];
                    }
                }
            }
        }
        else    //A.f = B
        {
            for(int j=0; j<26; j++)
            {
                if(ans[l[0] - 'A'][j])
                {
                    for(int k=0; k<26; k++) a[l[2] - 'a'][j][k] |= ans[r[0] - 'A'][k];
                }
            }
        }
    }
}
int main()
{
    scanf("%d", &N);
    for(int i=1; i<=N; i++)
    {
        q[i].In();
    }
    int tim = N + 1;
    while(tim--)
    {
        solve();
    }
    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);
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/107752869
今日推荐