相似折线图
1 Sec 64 MB | Markdown 显示标签
一般 (*1600) 字符串 哈希 KMP
61 | 160 |
通过 | 提交 |
题目描述
你是一名统计学大师,经常会和柱形图、折线图、饼图等图表打交道。
但有一天,你费尽千辛万苦绘制的一张折线图被熊孩子拆成了好几条折线!
更离谱的是,熊孩子删除了其中的几条折线,甚至还自己随便画了几条毫无相关的折线塞进了你的电脑里……
万幸的是你养成了随手备份的习惯,才避免自己的心血毁于一旦。
你看着电脑上剩下的这几条折线,忽然思绪涌上心头,你开始对于“这些折线是否是从原本的折线上拆出来的”这一奇怪的问题感到好奇。
现在你拥有着一份原折线图的数据 $H_0, H_1, H_2, \cdots, H_n$,表示在 $x=i,y=H_i$ 处有一关键点,且对于任意 $i \in [1,n]$,在 $(i-1, H_{i-1})$ 与 $(i, H_i)$ 两点间有一线段连接。
例如,当 $H = \{1,3,2,5,4,5,3\}$ 时,对应的折线图如下图所示:
![1681035952617.png](/userfiles/images/264832ad-16c0-43c8-a2d1-26e6622ec8b4.png)
你还拥有 $q$ 条折线,数据给定的方式同上,这些折线中有一些是从原图的线段里拆出来的,但可能整段被平移过,因而其各点的高度可能与原图中的高度不同。
你的任务是找出有哪些折线可能是从原图中拆出来的,即有哪些线段与原图某段区间内的线段相似。
输入格式
第一行包含一个整数 $n$ $(1 \le n \le 10000)$,表示原折线图的线段数。
第二行包含 $n + 1$ 个整数 $H_0, H_1, \cdots, H_n$ $(0 \le H_i \le 100)$,其中 $H_i$ 表示原折线图在 $(i, H_i)$ 处存在一个关键点。
第三行包含一个整数 $q$ $(1 \le q \le 2000)$,表示询问的折线数量。
其后 $q$ 行,第 $i$ 行表示编号为 $i$ 的待询问线段,第一个整数 $m_i$ $(1 \le m_i \le 1000)$ 表示该条折线的线段数,其后跟 $m + 1$ 个整数 $h_{i,0}, h_{i,1}, \cdots, h_{i,m}$ $(0 \le h_{i,j} \le 100)$ 表示该折线在 $(j, h_{i,j})$ 处存在一个关键点。
输出格式
第一行输出一个整数 $t$,表示可能是从原图中拆出来的折线的数量。
第二行包含 $t$ 个整数,按从小到大的顺序依次输出这些折线的编号。如果 $t=0$,第二行留空。
样例输入 #1
6 1 3 2 5 4 5 3 3 2 1 0 1 2 0 1 0 1 0 3
样例输出 #1
2 1 3
提示
对于样例:
如下图所示,询问中的第一条线段可能是从原图中 $x \in [3, 5]$ 这一段拆出来的,第三条线段则可能是从原图中 $x \in [2, 3]$ 这一段拆出来的。
![1681035964935.png](/userfiles/images/3ccd1ca2-2534-4ac9-8fd8-7435124299ad.png)
来源
2023-04-16 ZJNU 天梯赛模拟场 L2-4