[题解]GYM 104020D Dividing DNA
题意
给定一个 表示有 个字符串 ,并且有一个字符串集合 。( 和 都是未知的)
你需要将 分为若干段,使得每一段都不是 中任意一个字符串的子串。
你可以通过询问至多 次,形如 ? i j
。
它将返回 present
或 absent
,分别表示 是 中某一个字符串的子串,和不是任何一个字符串的子串。
最后输出 ! x
,表示将 最多分为 段,使其满足条件。
思路
用双指针 扫一遍,其中有一个贪心策略,如果 已经是 中任意一个字符串的子串了,那么,我们就可以将 开始新一段的查询。
那么,可以保证,询问次数最多为 。
Code
#include <bits/stdc++.h>
#define re register
using namespace std;
int n,ans;
int main(){
cin >> n;
for (re int i = 0,j = 0;j < n;){
string op;
cout << "? " << i << " " << j + 1 << "\n";
cin >> op;
if (op[0] == 'a'){
ans++;
i = j + 1;
j++;
}
else j++;
}
cout << "! " << ans;
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18268791
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】