• codeforces1194C From S To T 思维+双指针


    网址:http://codeforces.com/contest/1194/problem/C

    题意:

    给出字符串$s,p,t$,每一次可以从$p$中移动一个字符到$s$的任意位置,即从$p$中删除一个字符,往$s$中插入一个同样的字符。问能不能构造出$t$。

    题解:

    首先判断$s$和$p$的字符数和够不够$t$的,不够就是$“NO”$,如果够了,判断$s$是否是$t$的子序列,是就是$“YES”$,反之$“NO”$。

    AC代码:

    #include <bits/stdc++.h>
    using namespace std;
    int alpn[26],alpo[26];
    bool check1()
    {
        bool flag=1;
        for(int i=0;i<26;++i)
            if(alpn[i]<alpo[i])
            {
                flag=0;
                break;
            }
        return flag;
    }
    bool check2(string &s,string &t)
    {
        bool flag=0;
        int spos=0,tpos=0;
        while(spos!=s.size())
        {
            if(tpos==t.size())
                return 0;
            if(s[spos]==t[tpos])
                ++spos,++tpos;
            else
                ++tpos;
        }
        return 1;
    }
    int main()
    {
        string s,t,p;
        int n;
        cin>>n;
        while(n--)
        {
            cin>>s>>t>>p;
            memset(alpn,0,sizeof(alpn));
            memset(alpo,0,sizeof(alpo));
            for(int i=0;i<s.size();++i)
                ++alpn[s[i]-'a'];
            for(int i=0;i<p.size();++i)
                ++alpn[p[i]-'a'];
            for(int i=0;i<t.size();++i)
                ++alpo[t[i]-'a'];
            if(!check1()||!check2(s,t))
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    0430
    hlg1306再遇攻击--射线法判断点是否在多边形内部
    hlg1429凸多边形 二分+叉积
    计算几何
    像个孩子一样
    i am so happy
    hdu3371Connect the Cities---最小生成树kruskal
    hlg1339Touring DIJ+堆优化
    hdu3790最短路问题
    Lucky Goddess
  • 原文地址:https://www.cnblogs.com/Aya-Uchida/p/11214287.html
Copyright © 2020-2023  润新知