题目链接
好一篇阅读理解!——题记
这题就是给你一个关于指针的定义。首先,有指针、成员、对象三个定义,这些与基础的C语言无差别。
然后有四种操作:
- A = x:表示指针A指向成员x;
- A = B:表示指针A指向(指针B指向的所有的成员);
- A.f = B:表示指针A的全体成员的指针f指向(指针B指向的所有的成员);
- 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;
}