【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;
}


posted @ 2017-06-27 13:42  wzzkaifa  阅读(114)  评论(0编辑  收藏  举报