noip模拟赛 fateice-string

Posted zbtrs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noip模拟赛 fateice-string相关的知识,希望对你有一定的参考价值。

题目背景

Aldnoah

——火星上超古代文明留下的能量源,承认初代火星移民雷伊·雷加利亚博士(即后来的薇瑟帝国初代皇帝)为正统继承者,启动因子融入皇族的遗传因子中,只有皇族天生具有Aldnoah的启动能力。可以把Aldnoah看成是有认主能力的特殊矿产。在火星骑士的扬陆城中,安置有Aldnoah的启动装置。

技术分享

题目描述

两天前,被授予启动能力的斯雷因·特洛耶特伯爵准备对启动装置进行加密,以防有人趁其不备破坏装置。

技术分享

他将这个任务交给了他的心腹哈库莱特。忠实的哈库莱特认为,只需要输入密码就能解锁的加密装置实在是太不安全了,所以他决定用一个特别的加密装置来对Aldnoah启动装置进行保护。

他精心设计了这样一套加密装置:

该装置会给定解密者两个字符串s,t,其中s只包含小写字母以及*,t只包含小写字母。解密者可以进行任意多次操作,每次选择s中的一个*,将它修改为任意多个(可以是0个)它的前一个字符。询问是否能将s修改为t。

聪明的哈库莱特当然不会只给予解密者一组数据啦,所以解密时会有多组数据出现,并且每组数据只有在规定时间内答对才能够继续解密下一组数据。

今天他制作好了加密装置交给了斯雷因·特洛耶特伯爵,斯雷因准备先进行测试过后再将它安装在启动装置上。他随机制造了几组测试数据输入装置,然后让哈库莱特进行解密。哈库莱特会怎么做呢?

输入输出格式

输入格式:

 

第一行一个整数T表示数据组数。

每组数据两行,第一行一个字符串s,第二行一个字符串t。

 

输出格式:

 

每组数据输出一行,如果能将s修改为t,输出Yes,否则输出No。

 

输入输出样例

输入样例#1:
2
a*
aaaa
a*
ab
输出样例#1:
Yes
No

说明

对于20%的数据,|s|,|t|<=7。

对于60%的数据,|s|,|t|<=300。

对于100%的数据,T<=100,|s|,|t|<=30000。

分析:这道题能拿多少分在于你枚举什么.如果你枚举每个*赋值多少个字母,那么就有20分,如果你枚举两个串,那么就有60分,如果你枚举一个串,看看另外一个串是否符合要求就是满分.

      因为每个*只对同一字母有影响,所以把每一段字母相同的连同*分成一段,如果第二个字符串第i段有x个字母,那么第一个字符串中第i段也应该有x个字母,如果里面有*号那么可以少于x个字母,否则就必须等于x个字母,否则匹配不成功,扫一遍就可以了.

      多组数据一定要初始化!本来A掉的结果忘了初始化爆0了QAQ.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int T;
char s1[30010], s2[30010];
int len1, len2, cur, num;
bool flag = false;

bool pipei(int x, char biaozhun)
{
    int res = 0;
    bool can = false;
    while (s1[cur] != biaozhun && cur <= len1)
    {
        if (cur > len1)
            return false;
        if (s1[cur] == *)
            can = 1;
        else
            res++;
        cur++;
    }
    if (res < x && can)
        return true;
    if (res < x && !can)
        return false;
    if (res == x)
        return true;
    if (res > x)
        return false;
}

int main()
{
    scanf("%d", &T);
    while (T--)
    {
        num = 0;
        flag = 0;
        memset(s1, 0, sizeof(s1));
        memset(s2, 0, sizeof(s2));
        scanf("%s", s1 + 1);
        scanf("%s", s2 + 1);
        len1 = strlen(s1 + 1);
        cur = 1;
        len2 = strlen(s2 + 1);
        while (s1[cur] == * && cur <= len1)
            cur++;
        if (cur > len1)
        {
            printf("No\n");
            continue;
        }
        if (s1[cur] != s2[1])
        {
            printf("No\n");
            continue;
        }
        for (int i = 1; i <= len2; i++)
        {
            num++;
            if (s2[i] != s2[i + 1])
            {
                if (!pipei(num, s2[i + 1]))
                {
                    flag = 1;
                    break;
                }
                num = 0;
            }
        }
        if (flag)
            printf("No\n");
        else
            printf("Yes\n");
    }

    return 0;
}

 



以上是关于noip模拟赛 fateice-string的主要内容,如果未能解决你的问题,请参考以下文章

17.2.10 NOIP模拟赛 藏妹子之处(excel)

NOIP2016提高A组模拟中秋节9.15总结

noip模拟赛 写代码

NOIp模拟赛binary

NOIP模拟赛16

NOIp模拟赛value