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