zoukankan      html  css  js  c++  java
  • Pointer Analysis

    J. Pointer Analysis

    读题的时候一定要仔细啊…比赛的时候读错题,写了半天都是 wa 的

    其实只要把思路理清了,实现起来就很方便了。

    对于每一个大写字母,只需要保存其可指向的对象即可,因为最多只有26个,因此直接用状态压缩即可,而且对于合并操作也很方便。

    // Created by CAD
    #include <bits/stdc++.h>
    using namespace std;
    
    char l[200][10],r[200][10];
    const int maxn=26*26+26;
    int ans[maxn];
    int main(){
        int n;scanf("%d",&n);
        for(int i=0;i<n;++i)
            scanf("%s = %s",l[i],r[i]);
        for(int t=0;t<26*maxn;++t)
            for(int i=0;i<n;++i)
                if(islower(r[i][0]))                        //A=a
                    ans[l[i][0]-'A']|=1<<(r[i][0]-'a');
                else if(!l[i][1]&&!r[i][1])                 //A=B
                    ans[l[i][0]-'A']|=ans[r[i][0]-'A'];
                else if(l[i][1]=='.')                       //A.f=B
                    for(int j=0;j<26;++j){
                        if(ans[l[i][0]-'A']>>j&1)
                            ans[26+j*26+l[i][2]-'a']|=ans[r[i][0]-'A'];
                    }
                else                                        //A=B.f
                    for(int j=0;j<26;++j)
                        if(ans[r[i][0]-'A']>>j&1)
                            ans[l[i][0]-'A']|=ans[26+j*26+r[i][2]-'a'];
        for(int i=0;i<26;++i){
            cout<<char('A'+i)<<": ";
            for(int j=0;j<26;++j)
                if(ans[i]>>j&1) cout<<char('a'+j);
            cout<<endl;
        }
    }
    
  • 相关阅读:
    Java练习 SDUT-1117_求绝对值(选择结构)
    Java练习 SDUT-2561_九九乘法表
    Java练习 SDUT-1160_某年某月的天数
    HDU-1024_Max Sum Plus Plus
    博客园页面DIY
    JDBC
    JavaSE | Lambda| Optional| Stream API
    JavaSE| 网络编程
    JavaSE| 反射
    JavaSE | IO流
  • 原文地址:https://www.cnblogs.com/CADCADCAD/p/13418713.html
Copyright © 2011-2022 走看看