zoukankan      html  css  js  c++  java
  • 【HDOJ 1009】 CRB and String

    【HDOJ 1009】 CRB and String


    每组两个串s t 仅仅由小写字母组成 问从s能不能变成t

    改变的操作为选一个字符 在后面加上一个与所选字符不同的字符

    这样的操作能够做无数次 问能不能达t

    首先s能到t的首要条件是 对于随意字母 s中出现的次数小于等于t中出现的次数

    其次细致想想能够发现 满足上一条件后 假设不存在连续的同样字符 s肯定能变成t(细致想想

    而同样的连续字符假设在串中(不在串首 可不断在其前的字符后累加该字符

    因此仅仅需看t开头有没有连续的同样字符 假设与s开头连续的同样字符为同一字符 而且长度小于等于s开头的连续同样字符长度

    即为Yes

    不满足以上两个条件 即为No


    代码例如以下:


    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    using namespace std;
    
    char s[100005],t[100005];
    int sz[26],tz[26];
    
    int main()
    {
        int T,i,j,lens,lent;
        bool f;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s %s",s,t);
            if(s[0] != t[0])
            {
                puts("No");
                continue;
            }
    
            memset(sz,0,sizeof(sz));
            memset(tz,0,sizeof(tz));
            lens = lent = 0;
            f = 0;
            for(i = 0; s[i]; ++i)
            {
                sz[s[i]-'a']++;
                if(!f && (!i || s[i] == s[i-1])) lens++;
                else f = 1;
            }
    
            f = 0;
            for(i = 0; t[i]; ++i)
            {
                tz[t[i]-'a']++;
                if(!f && (!i || t[i] == t[i-1])) lent++;
                else f = 1;
            }
    
            if(t[0] == s[0] && lens >= lent)
            {
                for(i = 0; i < 26; ++i)
                {
                    if(sz[i] > tz[i]) break;
                }
                if(i == 26) puts("Yes");
                else puts("No");
            }
            else puts("No");
        }
        return 0;
    }
    


  • 相关阅读:
    单例模式
    建造者模式
    工厂方法模式
    原型模式
    适配器模式
    桥接模式
    装饰模式
    组合模式
    多线程的学习与GDI的学习
    我们复习.Net的这些日子里
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7084735.html
Copyright © 2011-2022 走看看