zoukankan      html  css  js  c++  java
  • 【ZOJ 3480】Duck Typing

    题意

    1.有t组数据,输入时每组数据之间空格隔开,输出时也要求空格隔开。

    2.每组都是一行begin开始,一行end结束。

    3.class ClassName[:Super] 表示声明一个类型,Super值存在时,说明它继承Super类型。

    4.def ClassName.Method 表示声明ClassName类型的一个方法。

    5.undef ClassName.Method 表示删除该类型下该方法。

    6.call ClassName.Method 表示调用该方法,如果该类型本身没有该方法,就去看它祖先是否有。

    分析

    可以用字符串string的函数处理,也可以用char处理(我写的姿势不是很好看,手动捂脸)。

    说几个容易错的地方:。。其实姿势不同,会错的地方也不同。最口怕的是我WA在了把“oops"拼写成"opps"了QAQ。还有比如”.“不要写成”:“了!

    代码

    char处理

      1 #include<cstdio>
      2 #include<cstring>
      3 
      4 struct cla
      5 {
      6     char name[50];
      7     int mnum;//num of method
      8     char md[50][50];//method
      9     int super;
     10 } a[10050];
     11 void read(char c,int &flag,char name[][50])
     12 {
     13     int k=0;
     14     int len=0;
     15     int cnt=0;
     16     flag=1;
     17     if (c=='b' ||c=='e') flag=0;//begin/end
     18     while((c=getchar())&&c!='
    ')
     19     {
     20         cnt++;
     21         if (cnt==1 && flag)
     22         {
     23             if (c=='e') flag=2;
     24             else if (c=='a') flag=3;
     25             else if (c=='n') flag=4;
     26         }
     27         if (flag==1 && cnt>5 ||//class ClassName
     28                 flag==2 && cnt>3 ||//def ClassName.Method
     29                 flag==3 && cnt>4 ||//undef ClassName.Method
     30                 flag==4 && cnt>5 ||//call ClassName.Method
     31                 flag==5 )//class Sub:Super
     32         {
     33             name[k][len]=c;
     34             if (c==':')
     35             {
     36                 name[k][len]='';
     37                 len=-1;
     38                 k=1;
     39                 flag=5;
     40             }
     41             if (c=='.')
     42             {
     43                 name[k][len]='';
     44                 len=-1;
     45                 k=1;
     46             }
     47             len++;
     48         }
     49     }
     50 }
     51 
     52 int check(int flag,int &mp,int &fp,char name[][50],int cnum)
     53 {
     54     int defined1=0,defined2=0;
     55     int i,j;
     56 
     57     for(i=1; i<=cnum; i++)
     58         if (strcmp(a[i].name,name[0])==0)
     59             defined1= i;
     60     if (flag==1)
     61     {
     62         if(defined1) return -1;
     63         return 0;
     64     }
     65     if (flag==5)
     66     {
     67         if(defined1) return -1;
     68         else
     69         {
     70             for(i=1; i<=cnum; i++)
     71                 if(strcmp(a[i].name,name[1])==0)
     72                     defined1= i;
     73             if (defined1==0) return -1;
     74             return defined1;
     75         }
     76     }
     77     if (!defined1) return -1;
     78 
     79     int f=defined1,ok=0;
     80     while(f!=0&&!ok)
     81     {
     82         for(j=1; j<=a[f].mnum; j++)
     83         {
     84             if (strcmp(a[f].md[j],name[1])==0)
     85             {
     86                 defined2=j;
     87                 ok=1;
     88             }
     89         }
     90         mp=defined2;
     91         fp=f;
     92         if(flag==3)f=a[f].super;
     93         else f=0;
     94     }
     95 
     96     if (flag==2)
     97     {
     98         if (defined2) return -2;
     99     }
    100     else if (!defined2) return -1;
    101     return defined1;
    102 }
    103 
    104 void work(int flag,int p,int mp,int fp,char name[][50],int &cnum)
    105 {
    106     if(flag==1)
    107     {
    108         cnum++;
    109         strcpy(a[cnum].name,name[0]);
    110         a[cnum].super=0;
    111         printf("class %s
    ",name[0]);
    112     }
    113     else if(flag==2)
    114     {
    115         if(p==-2)
    116         {
    117             printf("redef %s.%s
    ",name[0],name[1]);
    118         }
    119         else
    120         {
    121             strcpy(a[p].md[++a[p].mnum],name[1]);
    122             printf("def %s.%s
    ",a[p].name,name[1]);
    123         }
    124     }
    125     else if(flag==3)
    126     {
    127         printf("invoke %s.%s
    ",a[fp].name,name[1]);
    128     }
    129     else if(flag==4)
    130     {
    131         memset(a[fp].md[mp],0,sizeof(a[fp].md[mp]));
    132         printf("undef %s.%s
    ",name[0],name[1]);
    133     }
    134     else if(flag==5)
    135     {
    136         cnum++;
    137         strcpy(a[cnum].name,name[0]);
    138         a[cnum].super=p;
    139         printf("class %s:%s
    ",name[0],name[1]);
    140     }
    141 }
    142 int main()
    143 {
    144     int t;
    145     scanf("%d ",&t);
    146     while(t--)
    147     {
    148         int cnum=0;
    149         int flag;
    150         
    151         //mp 是该方法在该类型的方法里是第几个
    152         //fp 是该方法的所属的类型是第几个 
    153         int mp,fp;
    154         char c;
    155         memset(a,0,sizeof(a));
    156         while(~(c=getchar())&&c!='
    ')
    157         {
    158             char name[2][50]= {"",""};
    159             read(c,flag,name);
    160             if(flag)
    161             {
    162                 int p=check(flag,mp,fp,name,cnum);
    163                 if(p==-1)
    164                     printf("oops!
    ");
    165                 else
    166                     work(flag,p,mp,fp,name,cnum);
    167             }
    168         }
    169         printf("
    ");
    170     }
    171     return 0;
    172 }

    string处理

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <map>
      4 #include <string>
      5 
      6 using namespace std;
      7 
      8 int main()
      9 {
     10     map<string,string>fa;
     11     map<string,int>cla;
     12     map<string,int>me;
     13     string s,first,cName,m,cm,super;
     14     int t;
     15     cin>>t;
     16     while (t)
     17     {
     18         cin>>s;
     19         if (s=="begin")
     20         {
     21             cla.clear();
     22             fa.clear();
     23             me.clear();
     24         }
     25         else if (s=="end")
     26         {
     27             t--;
     28             cout<<"
    ";
     29         }
     30         else if (s=="class")
     31         {
     32             cin>>first;
     33             int i=first.find(':');
     34             if (i==string::npos)
     35             {
     36                 if (cla[first])
     37                     cout<<"oops!
    ";
     38                 else
     39                 {
     40                     cla[first]=1;
     41                     cout<<s<<" "<<first<<"
    ";
     42                 }
     43             }
     44             else
     45             {
     46                 super=first.substr(i+1);
     47                 first=first.erase(i);
     48                 if (cla[super]==1 && cla[first]==0)
     49                 {
     50                     cla[first]=1;
     51                     fa[first]=super;
     52                     cout<<s<<" "<<first<<":"<<super<<"
    ";
     53                 }
     54                 else
     55                     cout<<"oops!
    ";
     56             }
     57         }
     58         else if (s=="def")
     59         {
     60             cin>>first;
     61             cName=first.substr(0,first.find('.'));//sub str before .
     62             if (cla[cName]==0)
     63                 cout<<"oops!
    ";
     64             else
     65             {
     66                 if (me[first]==1)
     67                     cout<<"redef "<<first<<"
    ";
     68                 else
     69                 {
     70                     me[first]=1;
     71                     cout<<s<<" "<<first<<"
    ";
     72                 }
     73             }
     74         }
     75         else if (s=="undef")
     76         {
     77             cin>>first;
     78             if (me[first]==0)
     79                 cout<<"oops!
    ";
     80             else
     81             {
     82                 me[first]=0;
     83                 cout<<s<<" "<<first<<"
    ";
     84             }
     85         }
     86         else if (s=="call")
     87         {
     88             cin>>first;
     89             m=first.substr(first.find('.'));
     90             cName=first.substr(0,first.find('.'));
     91             cm=first;
     92             while(me[cm]==0 && (!cName.empty()))
     93             {
     94                 cm=fa[cName]+m;
     95                 cName=fa[cName];
     96             }
     97             if (cName.empty())
     98                 cout<<"oops!
    ";
     99             else
    100                 cout<<"invoke "<<cm<<"
    ";
    101         }
    102     }
    103     return 0;
    104 }
  • 相关阅读:
    (转)elasticsearch collapse 折叠字段应用
    java 8 supplier object区别
    搜索 rerank : learn to rank 算法
    Runtime.addShutdownHook用法
    MAT(memory anlayzer tool)使用方法
    win10 打开注册表
    关于svn 更新到本地库 图标不显示问题(二)
    如何重启explorer,不用重启电脑 也能使设置生效
    关于svn 更新到本地库 图标不显示问题(一)
    eclipse 编写完JAVA的代码 ctrl+s保存一下,右下角就有building workspace一直在执行。。特别卡、卡、、
  • 原文地址:https://www.cnblogs.com/flipped/p/5198629.html
Copyright © 2011-2022 走看看