zoukankan      html  css  js  c++  java
  • Codeforces 87B

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    题目大意:

    有这样一种语言&K*语言,有两种基本类型,void和errtype,同有两种运算方式:

    • typedef A B 将A定义为B,B中不可以带&*
    • typeof A 输出A对应的void类型

    这个语言有一个非常强大的指针系统,void * 表示指针,&表示取消引用,即:&void(5个星号) = void(4个星号),星号的优先级始终高于&,即:&void * = void,如果&&void * 则会导致错误的类型errtype,错误的类型一旦出现,无论什么操作都是错误类型,即errtype ****** = errtype,typedef A B如果A没有没定义过,那么B仍然是错误类型(WA点),对于每一个typeof操作,输出对应的void类型。

    解题思路:

    大模拟,理清思路就简单了,这里用三个map,一个用来存定义B的类型A,一个用来存B类型里面星号的个数,vis用于存储该类型是否出现过,每次先计算最后应该剩下的星号个数,如果小于0,则说明该类型就是错误类型,如果>=0 则存入map,处理完后判断是否只剩viod,如果只剩void则不用存map,反之要存入定义他的A类型和A类型对应的星号个数 + 现有的星号个数即可。

    Code:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    using namespace std;
    const int mod = 1e9 + 7;
    const int N = 150;
    const int inf = 0x3f3f3f3f;
    typedef long long ll;
    map<string, int> mp;
    map<string, string> mp1;
    map<string, int> vis;
    int main()
    {
    	int t; 
    	cin >> t;
    	while (t--)
    	{
    		string op;
    		cin >> op;
    		if (op == "typedef")
    		{
    			string a, b;
    			cin >> a >> b;
    			int l = 0, r = a.size() - 1, r1 = 0;
    			while (a[l] == '&') l++;
    			while (a[r] == '*') r--, r1 ++;
    			string ty = "";
    			for (int i = l; i <= r; i ++)//处理去掉&*后的类型名
    			  ty += a[i];
    			if (ty == "void")//如果是void则不用加上父级的星号个数
    			{
    				mp1[b] = "void";
    				mp[b] = r1 - l;
    				vis[b] = 1;
    			}
    			else//如果不是则需要加上父级个数,如果父级为errtype,那么他也是错误类型
    			{
    				mp1[b] = ty;
    				if (mp[ty] >= 0 && vis[ty])
    				  mp[b] = mp[ty] + (r1 - l);
    				else
    				  mp[b] = -1;
    				vis[b] = 1;//标记是否出现过
    			}
    		}
    		else
    		{
    			string a;
    			cin >> a;
    			int l = 0, r = a.size()-1, r1 = 0;
    			while (a[l] == '&') l++;
    			while (a[r] == '*') r--, r1 ++;
    			string ty = "";
    			for (int i = l; i <= r; i ++)//这里还是先处理,处理完之后再加上父级的星号个数
    			  ty += a[i];
    			if (!vis[ty])//如果没有出现过则需要判断是什么类型,不是void就是错误
    			{
    				if (ty != "void")
    				  cout << "errtype" << endl;
    				else
    				  cout << "void" << endl;
    				continue;
    			}
    			if (mp[ty] < 0 || mp[ty] + (r1 - l) < 0)//如果父级小于0则无论再怎么操作都是错误的类型
    			  cout << "errtype" << endl;
    			else
    			{
    				cout << "void";
    				for (int i = 1; i <= mp[ty] + (r1 - l); i ++)
    				  cout << "*";
    				cout << endl;
    			}
    		}
    	}
    	//system("pause");
    	return 0;
    }
    
  • 相关阅读:
    PHP读取excel中地址实现多文件下载
    PHP中域名绑定
    js生成word中图片处理
    Mysql查询不为null值
    Specified key was too long max key length is 1000 bytes
    无法向Windows服务器复制粘贴文件
    Sql Server Configuration Manager 网络配置为空,没有实例
    The first one
    前端基本知识 防抖、节流,compose 函数,apply,bind,call
    写一个闭包 ,每次调用都加1
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294184.html
Copyright © 2011-2022 走看看