第十六届 商汤杯

Problem E. 最后的轻语

输入文件: standard input
输出文件: standard output
时间限制: 1 second
空间限制: 2048 megabytes
小钾在背单词。
在本题中,我们认为单词是仅由小写字母构成的字符串。
在背完一个单词 s 后,小钾尝试将这个单词拼写出来。由于记忆不牢,小钾可能会忘记要拼写的下一个字母是什么,这时他会选择从头开始拼写这个单词。如果小钾成功拼写出了完整的 s,这时为了加深记忆,他也会选择从头开始拼写这个单词。小钾可以任意次尝试拼写 s,并可以在任何时候结束拼写。
在拼写结束后,小钾将每次拼写的结果依次连接起来,得到的是另一个仅由小写字母构成的字符串t。小钾想知道他的拼写结果是否有. 可. 能. 正. 确. 。有可能正确是指,当小钾采用某种拼写顺序时,可以拼写出 t。
比如对于单词 buaa,小钾可以拼写出 bu + buaa + b = bubuaab。但小钾不可能正确地拼写出buuaa。
现在你得到了小钾要背的单词 s 和他的拼写结果 t。由于 s 和 t 可能很长,小钾希望你能告诉他,他的拼写是否有可能正确。

本. 题. 包. 含. 多. 组. 数. 据. 。
第一行包含一个整数 t(1 ≤ t ≤ 5 × 105),表示数据组数。
每组数据包含两行,分别代表 s 和 t(1 ≤ |s|, |t| ≤ 5 × 105,s, t 均由小写字母构成)。
保证 ∑|s| ≤ 5 × 105,
∑|t| ≤ 5 × 105。
输出:
对于每组数据,输出一行一个字符串,如果小钾的结果可能正确,输出 Yes,否则输出 No(大小写
不敏感)。

  • 输入:3
    apple
    apaple
    banana
    banbabb
    nanami
    nanami
  • 输出:No
    Yes
    Yes
/*made in Zzh*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int ne[N];
char s[N], p[N];

int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%s%s", s + 1, p + 1);
        int n = strlen(s + 1);
        int m = strlen(p + 1);
        for (int i = 2, j = 0; i <= n; i++)
        {
            while (j && s[i] != s[j + 1])
                j = ne[j];
            if (s[i] == s[j + 1])
                j++;
            ne[i] = j;
        }
        int f = 0;
        for (int i = 1, j = 0; i <= m; i++)
        {
            while (j && p[i] != s[j + 1])
                j = ne[j];
            if (p[i] == s[j + 1])
                j++;
            if (!j)
            {
                printf("NO\n");
                f = 1;
                break;
            }
        }
        if (!f)
            printf("YES\n");

        for (int i = 1; i <= n; i++)
            ne[i] = 0;
    }
}

Problem F. 魔法少女莫卡的诞生

莫卡是某不知名高中一名普通的学生,在校园生活中,莫卡结识了许多朋友。
一天,莫卡发现自己的好朋友之一——Serval 不见了。经过一番寻找,莫卡在一间实验室门口听到了
Serval 的声音,并且得知 Serval 被奇异的魔法困在了实验室中。
一种独特的魔法密码锁锁住了实验室,密码锁共有 2n 位,每一位是一个大小在 [1, 2n] 的整数且任
意两位的数字不同。莫卡每次可以选择两个相. 邻. 的位置并使用魔法交换其中的数字。当对于所有的奇. 数.
位置 i,第 i 位的数字不超过第 i + 1 位的数字时,密码锁会变成和谐状态,魔法会消失。
为了救出朋友,莫卡签订契约成为了魔法少女。但是更多的魔力需要签订代价更高的契约,因此她向
你求助,请你帮她计算出使密码锁到达和谐状态需要的最小交换次数。
输入
第一行包含一个整数 n(1 ≤ n ≤ 5 × 104)。
第二行包含 2n 个整数,表示密码锁的初始状态。
输出
输出一行一个整数,表示莫卡救出 Serval 需要的最小交换次数。

  • 输入:3
    2 4 6 3 5 1
  • 输出:2
/*made in Zzh*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
const int N = 1e6 + 10;
int n, m;
int a[N];
char s[N], p[N];

int main()
{
    int n;
    scanf("%d",&n);
    n*=2;
    for(int i = 0;i<n;i++){
        scanf("%d",&a[i]);
    }
    int ans = 0;
    for(int i = 0;i<n;i+=2){
        if(a[i]<a[i+1]){
            continue;
        }
        else {
            if(a[i+2]>a[i]){
                swap(a[i+1],a[i+2]);
                ans++;
            }
            else
                ans++;
        }
    }
    printf("%d\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pig2687

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值