题目链接 : E - Stamp (atcoder.jp)

题意:给定长为n的s串,m的t串,和一个长度为n的x串,问你能否操作任意次数的操作, 每次操作都可以使x中长度为m的存在串变为t,最后使得变为n

赛时没过,赛后有人发了原题,936. 戳印序列 - 力扣(LeetCode),看了很久的题解,发现做法太巧妙了,把字符串转化为(图论)拓扑图,属实想不到, 最后还能求出可以操作哪些位置

思路:因为前面的操作会影响后面的操作,所以要考虑倒推

本文采用类似于拓扑排序的思想。

我们记字母印章长度为 m ,目标字符串长度为 n 。我们拿字母印章在目标字符串上进行滑动,那么在目标字符串中总共将会有 n−m+1 个窗口。另外,我们将逆序操作过程中所得到的各窗口的起始端点值记录在列表 res 中,最后只需将 res 反转即可得到答案。

那么我们可以将本题和拓扑排序的相关概念进行映射:

>「入度」:每个窗口中对应字符不相同的总数,起始默认为 m。当入度为 0 时,说明这个窗口的所有字符都与目标字符串相对应,我们就可以把这个窗口放入到队列(不一定是 vector 的队列,任意容器均可, deque也可以)中。

>「边」:对于目标字符串的每个位置上,有不一致字符的窗口。我们用邻接表的方式存储边,如果一个滑动窗口的某一个字符与目标字符串不一致,那么我们就连一条边。
至此,我们通过拓扑排序,就可以得到最终的结果了:

1.遍历一遍所有的窗口,如果该位置上的字符与目标字符不一致,那么我们在邻接表中连接一条边;相反如果字符一致,那么该窗口的入度减 1。
2.当某个窗口的入度为 0 时,那么这个窗口的所有字符都与目标字符串相对应,我们可以将该窗口的起始端点放入到队列中。
3.将队列中的窗口依次出队,每次出队时,我们在 res 列表中记录该窗口的起始端点。
4.我们可以想象该窗口中的字符全部替换为 '#' ,表示可以匹配任意字符。那么我们可以从邻接表中将之前与该位置不同的窗口的入度都减 1。
5.重复(2),直到队列为空。
6.当队列为空时,判断 res 的长度是否与 n−m+1 相等,相等则完成了拓扑排序;不相等则说明无法印出目标字符串。
 7.如果完成了拓扑排序,那么 res 的长度一定是符合题目要求,我们只需返回逆序的 res 即可(逆序分析)。相反,我们返回一个空容器。最后根据容器大小ac这道题

ac代码

// Problem: E - Stamp
// Contest: AtCoder - Sky Inc, Programming Contest 2023(AtCoder Beginner Contest 329)
// URL: https://atcoder.jp/contests/abc329/tasks/abc329_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org) #include<bits/stdc++.h> using namespace std;
using ull = unsigned long long;
using ll = long long;
using PII = pair<int,int>;
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define endl "\n"
#define pb push_back
const int N=1e5+10;
const int INF=0x3f3f3f3f;
const int mod=998244353; void solve()
{
int n, m; cin >> n >> m;
string s, t; cin >> s >> t;
vector<vector<int>> g(n);
vector<int> ind(n - m + 1, m);
vector<int> q;
vector<bool> st(n);
for(int i = 0; i < n - m + 1; i ++)
{
for(int j = 0; j < m; j ++)
{
if(s[i + j] == t[j])
{
ind[i] --;
if(ind[i] == 0) q.pb(i);
}
else
g[i + j].pb(i);
}
}
vector<int> res;
while(q.size())
{
int u = q.back(); q.pop_back();
res.pb(u);
for(int i = 0; i < m; i ++)
{
if(st[u + i]) continue;
st[u + i] = true;
for(auto &&v : g[u + i])
{
ind[v] --;
if(ind[v] == 0) q.pb(v);//插到u后面,可以改变v窗口的元素
}
}
}
reverse(res.begin(), res.end());//正确的顺序
//for(auto it : res) cout << it << ' ';
if(res.size() < n - m + 1) cout << "No" << endl;
else cout << "Yes" << endl;
}
int main()
{
solve();
return 0;
}

E - Stamp的更多相关文章

  1. [BTS] Faulting application name: BTSNTSvc.exe, version: 3.9.469.0, time stamp: 0x4c547e09

    Log Name: ApplicationSource: Application ErrorDate: 8/22/2013 1:28:35 AMEvent ID: 1000Task Category: ...

  2. AtCoder Grand Contest 002 D - Stamp Rally

    Description We have an undirected graph with N vertices and M edges. The vertices are numbered 1 thr ...

  3. Can't parse message of type "gazebo.msgs.Packet" because it is missing required fields: stamp, type

    在gazebo的仿真环境中,采用强化学习HER算法训练baxter执行reach.slide和pick and place任务. 运行HER算法,此时尚未启动gazebo仿真环境,出现如下报错: [l ...

  4. Stamp Rally

    Stamp Rally 最大值最小,可以二分,然后并查集看能不能到z个点 但是询问过多,并且发现每次二分要加入的点并不是所有的m条边 于是就考虑整体二分 并查集的处理是重点: 对于一般的dfs分治树, ...

  5. make: *** No rule to make target `out/target/common/obj/APPS/framework-res_intermediates/src/R.stamp'

    /********************************************************************************** * make: *** No r ...

  6. 编译出现No rule to make target `out/host/linux-x86/bin/aapt', needed by `out/target/common/obj/APPS/MyTv4_intermediates/src/R.stamp'问题

    查找路径发现的确没有MyTv4_intermediates/src/R.stamp,这需要生成这个文件

  7. [AGC002D] Stamp Rally

    确实有想到重构树,不过没有继续下去的思路. 可能是对重构树的性质不太懂. 这种题目我们可以二分答案,考虑怎么\(check\)呢,整体二分+并查集,建出重构树,找去第一个小于这个数的方点,查询他的子树 ...

  8. make[1]: *** [/workopenwrt/trunk/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory `/work/openwrt/trunk' make: *** [world]

    主要原因是编译时未连上网,编译时需要下载些插件,连接网后,重启下系统再编译下.

  9. ROS time stamp and sync

    1. https://answers.ros.org/question/189867/what-is-the-timestamp/ In ROS messages timestamp is taken ...

  10. [USACO18JAN]Stamp Painting

    Description: Bessie想拿\(M\) 种颜色的长为\(K\) 的图章涂一个长为\(N\) 的迷之画布.假设他选择涂一段区间,则这段区间长度必须为\(K\) ,且涂完后该区间颜色全变成图 ...

随机推荐

  1. 读论文-基于会话的推荐系统综述(A survey on session-based recommender systems)

    前言 今天读的论文是一篇于2021年发表于"ACM Computing Surveys (CSUR)"的论文,文章写到,推荐系统在信息过载时代和数字化经济中非常重要.基于会话的推荐 ...

  2. 绝了!k3s (k8s) 安装 ollama 运行 deepseek 全流程揭秘,yaml全公开

    k3s (k8s) 环境搭建与 ollama 相关 yaml 文件部署 在容器编排的世界中,k3s (k8s) 无疑是备受瞩目的存在.此次聚焦在 k3s (k8s) 环境下安装 ollama,并实现运 ...

  3. 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!

    3月6日最新消息,阿里云通义千问官方宣布推出最新推理模型 QwQ-32B,这一模型仅有 32B 参数,但在效果上与拥有 671B 参数的 DeepSeek-R1 相媲美.如果你自己部署 DeepSee ...

  4. 【数学公式】mathtype和word2016集成

    mathtype 安装好了以后,word 没有相应的选项卡怎么办? 问题 解决办法 找到word的启动路径 2. 找到mathtype 安装好后的mathpage文件夹 进入文件夹,找到MathPag ...

  5. xpath 定位单选框

    分析页面结构: 整个页面只有一组radiogroup 一个group地下存在两个radio 思路定位到页面唯一元素->下面具体radio 代码: //div[@class='el-radio-g ...

  6. php7有哪些新特性

    目录 太空船操作符 标量类型声明和返回值的类型说明 null 合并操作符 常量数组 namespace 批量导入 非混合模式的 use 声明 混合模式的 use 声明 复合模式的 use 声明 thr ...

  7. selenium自动化测试入门

    Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案. Selenium是用于自动化控制浏览器做各种操作,打开网页,点击按钮,输入表单等等,可以 ...

  8. 面试官:工作中优化MySQL的手段有哪些?

    MySQL 是面试中必问的模块,而 MySQL 中的优化内容又是常见的面试题,所以本文来看"工作中优化MySQL的手段有哪些?". 工作中常见的 MySQL 优化手段分为以下五大类 ...

  9. netstat 与 ss 比较

    一.netstat 命令 1. 核心功能 显示网络连接.路由表.接口统计等信息. 支持TCP.UDP.UNIX域套接字等协议. 可查看进程与端口的关联. 2. 常用语法示例 查看所有活动连接 nets ...

  10. Envoy 学习笔记(一)

    该系列学习笔记是作者为记录云原生基础架构学习过程而写.若想要详细学习 envoy,大家可以去 tetrate 官网和官方文档中学习. 如果没有任何接触云原生的经验,可以在学习相关概念前,去了解以下概念 ...