第184场周赛

时间:2022-07-28
本文章向大家介绍第184场周赛,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

传送门

5380. 数组中的字符串匹配

题解:根据描述,加上简单题,以及数据规模很小,不妨有按照题目描述解法。

static bool cmp(string a,string b){
        return a.length()<b.length();
    }
    vector<string> stringMatching(vector<string>& words)
    {
        sort(words.begin(),words.end(),cmp);
        vector<string>ret;
        for(int i=0;i<words.size();i++)
        {
            for(int j=i+1;j<words.size();j++)
            {
                int begin=-1;
                if((begin=words[j].find(words[i],begin+1))!=string::npos)
                {//此句为字符串匹配
                    ret.push_back(words[i]);
                    break;
                }
            }
        }
        return ret;
    }

5381. 查询带键的排列

题解:根据描述,有了啊,有了啥?有了答案。

vector<int> processQueries(vector<int>& queries, int m) {
       vector<int>p;
       for(int i=1;i<=m;i++)p.push_back(i);//根据描述生成数组p
       vector<int>ret;
       for(int i=0;i<queries.size();i++){
           vector<int>::iterator it = find(p.begin(), p.end(),queries[i]);
           int tmp = *it;//1.保存移动的值
           p.erase(it);//2. 删掉
           ret.push_back(it-p.begin());//3. 插到最前面
           p.insert(p.begin(),tmp);//
       }
       return ret;
   }

1410. HTML 实体解析器

题解:本次周赛前三题都是模拟题呢?没有啥子变通,根据题意模拟就行啦,自己的代码功底(API)熟悉程度不行啊,哭唧唧。

string entityParser(string text) {
        map<string,char>m = {{"&gt",'>'},{"&lt",'<'},{"&amp",'&'},{"&quot",'"'},{"&apos",'''},{"&frasl",'/'}};
        string ret;
        
        for(int i=0;i<text.length();i++){
            if(text[i]!='&') ret+=text[i];
            else{
                int flag = 0;
                string sub = text.substr(i,3);
                for(auto j:m){
                    if(sub==j.first){
                        flag = 1;
                        ret+=j.second;
                        i+=3;
                        break;
                    }
                }
                
                sub = text.substr(i,4);
                for(auto j:m){
                    if(sub==j.first){
                        flag=1;
                        ret+=j.second;
                        i+=4;
                        break;
                    }
                }
                
                sub = text.substr(i,5);
                for(auto j:m){
                    if(sub==j.first){
                        flag=1;
                        ret+=j.second;
                        i+=5;
                        break;
                    }
                }
                sub = text.substr(i,6);
                for(auto j:m){
                    if(sub==j.first){
                        flag =1;
                        ret+=j.second;
                        i+=6;
                        break;
                    }
                }
                if(flag ==0) ret+='&';
            }
        }
    return ret;
    }

5383. 给 N x 3 网格图涂色的方案数

题解:先看图

根据上图,可以将排列情况分为两种,ABA,ABC,前者颜色有重复,后者无,在这两种下面再添加元素有这么12种选择

ABC ACB BAC BCA CAB CBA ABA ACA BAB BCB CAC CBC

可分别加入到下面的如表格所示

ABA

ABC

unrepeat:BAC

unrepeat:BCA

unrepeat:CAB

unrepeat:CAB

unrepeat:BAB

repeat:BCB

repeat:BAB

repeat:CAC

repeat:BCB

在形如ABA这样的下面只能由3种unrepeat填充,2种repeat填充

在形如ABC这样的下面只能由2种unrepeat填充,2种repeat填充

每次填充依赖选择,当前可填充数目为

repeat_n=3×unrepeat_{n-1}+2×repeat_{n-1}
unrepeat_n=2×unrepeat_{n-1}+2×repeat_{n-1}

总结好规律后有下面代码:

int numOfWays(int n) {
        if(n==0) return 0;
        if(n==1) return 12;
        long m = 6,k = 6;//k,m表示上一层repeat,unrepeat
        long repeat,unrepeat;
        for(int i=1;i<n;++i)
        {
            repeat = (2*(k+m))%1000000007;
            unrepeat = (3*m+2*k)%1000000007;
            m = unrepeat;
            k = repeat;
        }
        return (unrepeat+repeat)%1000000007;
    }