码迷,mamicode.com
首页 > 其他好文 > 详细

【HDOJ 1009】 CRB and String

时间:2015-08-20 18:54:30      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:多校

【HDOJ 1009】 CRB and String


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

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

这种操作可以做无数次 问能不能达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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【HDOJ 1009】 CRB and String

标签:多校

原文地址:http://blog.csdn.net/challengerrumble/article/details/47811893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!