#P12422. 【MX-X12-T5】「ALFR Round 5」Another string problem
【MX-X12-T5】「ALFR Round 5」Another string problem
题目背景
原题链接:https://oier.team/problems/X12E。
决(け)して逃(に)げない怖(こわ)くはないから
目(め)を开(あ)け弱(よわ)さをかき消(け)すんだ
题目描述
我们定义 为:设 ,则 个 连起来在 中以子序列出现过。例如 ,则 , 中出现的 有 $\underline{\textsf{ab}}\textsf c{\underline{\textsf{ab}}}$。
对于 组测试数据,给定一个 和正整数 , 次询问:
- 给定 ,问是否 。如果 ,输出
Yes
,否则输出No
。
输入格式
本题有多组测试数据,第一行输入一个整数 ,表示数据组数。对于每组数据:
- 第一行,一个字符串 和一个正整数 。
- 接下来 行,每行一个字符串 。
保证 均由小写英文字符(a
到 z
)组成。
输出格式
输出 行,第 行为第 组测试数据的答案(Yes
或 No
)。
2
abcaabc 2
abc
ab
abaabab 3
ab
aa
aba
Yes
No
Yes
No
Yes
提示
【样例解释】
第一组测试数据中, 时可以在 种寻找到 作为子序列,具体的, 种出现的 有 $\underline{\textsf{abc}}\textsf a{\underline{\textsf{abc}}}$。而 时 不是 的子序列。
第二组测试数据中,第一、三个询问分别有 $\underline{\textsf{ab}}\textsf a{\underline{\textsf{abab}}}$、$\underline{\textsf{aba}} {\underline{\textsf{aba}}}\textsf b$。
【数据范围】
本题使用捆绑测试。
对于 的数据,,,,,,并且 。 均由小写英文字符(a
到 z
)组成。
子任务 | 特殊性质 | 分值 | |
---|---|---|---|
无 | |||
数据随机 | |||
中不同字符最多 种 | |||
中不同字符最多 种 | |||
无 | |||
:并非完全均匀随机字符,具体见【子任务 3 数据随机方式】。
【子任务 3 数据随机方式】
下面是造“数据随机”的部分分的代码(因为 generator
较长,这里是所有有关片段):
mt19937 rng((unsigned long long) new char);
int rnd_l(int l,int r){
return rng()%(r-l+1)+l;
}
char rnd(vector<int> v){ // 0~25 权重
int sum=0;
for (auto u : v) sum+=u;
int r=rng()%(sum)+1,c=0;
sum=0;
for (auto u : v){
if (sum+u>=r) return c+'a';
c++;
sum+=u;
}
}
vector<int> pl;
void rnd_g(){
string s=rnd_s(pl,n);
cout<<s<<" "<<q<<endl;
string t=rnd_s(pl,n);
vector<int> ct=rnd_v(n,q);
ct.push_back(n);
for (int i=1,pr=0; i<=q; i++){
cout<<t.substr(pr,ct[i-1]-pr)<<endl;
pr=ct[i-1];
}
}
vector<int> rnd_v(int fw,int ti){ // 不可重复的划分
vector<int> ct;
ct.push_back(0);
for (int i=1,cr=0; i<ti; i++){
ct.push_back(rnd_l(cr+1,fw-(ti-i)));
cr=ct.back();
}
return ct;
}
for (int i=0; i<26; i++) pl.push_back(rnd_l(5,15));
需要注意的是,rnd
函数并非均匀随机,是按照随机生成的权重 pl
随机 的(即 的概率为 )。pl
每一个数据点都会重新生成。
这个代码中, 是数据范围内给定的数。随机的方式如下:
-
,均匀随机。
-
按照
rnd
函数随机生成一个 字符串和 字符串,长度均为 。 -
按照
rnd_v
函数随机一个 的分割,一共 个分割点,分成 段,分别为 。