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 }
  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/flipped/p/5198629.html
Copyright © 2011-2022 走看看