1. 程式人生 > >【HDOJ 1009】 CRB and String

【HDOJ 1009】 CRB and String

.cn 出現 滿足 ron urn str sca 發現 size

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


【HDOJ 1009】 CRB and String