• 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
    ");
                continue;
            }
            if (s1[cur] != s2[1])
            {
                printf("No
    ");
                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
    ");
            else
                printf("Yes
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    C#中的委托和事件(续)【来自张子扬】
    C# 中的委托和事件[转自张子扬]
    .NET多线程编程入门
    python——configparser模块
    logger模块
    python——time模块
    os模块
    python——re模块
    selenium环境搭建
    iOS中的三大定时器
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7671048.html
Copyright © 2020-2023  润新知