P9680 string[_view]

· · 题解

P9680 string[_view]

题意

  1. 两个字符类型,一个字符类型花费次数,一个不花费,花费次数是字符串长度。
  2. 在“赋给 string_view 类型不会拷贝字符。”中,赋给的意思就是等号右边的字符串类型是 string_view 的不会拷贝字符。

思路

  1. 首先是一堆麻烦的边角料,咱给他按模拟的思路去了。
  2. 可以发现如果是普通字符串类型,我们字符串内容没什么用,所以定两个 map 一个存字符串长度,一个存字符串是不是 string_view 类型,如果赋字符串变量就赋字符串变量的长度。
  3. 然后如果要花费直接加长度。

代码

#include<bits/stdc++.h>
using namespace std;
int l,da;
string fw,xiaochou,ming,neirong;
map<string,int> len;
map<string,bool> lihai;
int main()
{
    cin>>l;
    for(int i=1;i<=l;i++)
    {
        cin>>fw>>xiaochou;//俩小丑,咱们用完就把他俩甩了!
        bool f=0,mao=0;ming="";neirong="";
        //mao冒号?ming名字,neirong内容。
        for(int i=0;i<xiaochou.size();i++)
        {
            char x=xiaochou[i];//把小丑的钱给我家哥哥。
            if(x=='('||x==')'||x==';') f=1;//f判断是不是到赋值部分了。
            else if(x=='"') mao=1;//独立自主的。
            else if(f==0) ming=ming+x;//变量名字。
            else neirong=neirong+x;
        }
        if(mao)//有冒号?
        {
            len[ming]=neirong.size();
            lihai[ming]=fw.size()>8?1:0;//你什么血统?
            if(!lihai[ming]) da+=len[ming];//投胎不好直接制裁!
        }
        else//借助前辈的力量。
        {
            len[ming]=len[neirong];//直接啃老。
            lihai[ming]=fw.size()>8?1:0;//记录血统!
            if(!lihai[ming]) da+=len[neirong];//投胎不好继续制裁!
        }
    }
    cout<<da;
    return 0;
}