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

noip模拟赛 fateice-string

时间:2017-10-15 19:24:38      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:技术分享   algorithm   pipe   描述   div   破坏   必须   题目   org   

题目背景

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

标签:技术分享   algorithm   pipe   描述   div   破坏   必须   题目   org   

原文地址:http://www.cnblogs.com/zbtrs/p/7671048.html

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