【JZOJ5603】【NOI2018模拟3.27】Xjz
题目描述
给定字符串 S 和 T。
串A和串B匹配的定义改为:存在一个字符的映射,使得A应用这个映射之后等于B,且这个映射必须为一个排列。
A=121, B=313,当映射为{1->3, 2->1, 3->2}时A'=B,可以匹配
A=212, B=313,当映射为{1->1, 2->3, 3->2}时A'=B,可以匹配
A=232, B=313,当映射为{1->2, 2->3, 3->1}时A'=B,可以匹配
A=123, B=111,当映射为{1->1, 2->1, 3->1}时A'=B,但此时映射不为一个排列,不能匹配
求 S 的哪些连续子串与 T 匹配.
解题思路
两个字符串匹配就是指同构,
考虑如何判断同构,对于一段长度为m的子串,每个位置的值就是,与前面同色的位置的距离。
hash判断。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <bitset>
#include <set>
const int inf=2147483647;
const long long mo=1e15+7;
const int N=1000005;
using namespace std;
int a[N],b[N],n,m,c,T,ans[N],nxt[N],lst[N],co[N];
long long val,ha,mi[N];
void read(int &n)
{
char ch=' ';int q=0,w=1;
for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());
if(ch=='-')w=-1,ch=getchar();
for(;ch>='0' && ch<='9';ch=getchar())q=(q<<1)+(q<<3)+ch-'0';n=q*w;
}
int main()
{
scanf("%d%d",&T,&c);
mi[0]=1;
for(int i=1;i<N;i++) mi[i]=mi[i-1]*101%mo;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=m;i++) read(b[i]);
memset(lst,0,sizeof(lst)),memset(co,0,sizeof(co));
ha=val=0;
for(int i=1;i<=m;i++)
{
lst[i]=co[b[i]],co[b[i]]=i;
if(lst[i]) ha=(ha+1ll*(i-lst[i])*mi[m-i]%mo)%mo;
}
ans[0]=0;
memset(nxt,64,sizeof(nxt)),memset(lst,0,sizeof(lst)),memset(co,0,sizeof(co));
for(int i=1;i<=n;i++)
{
lst[i]=co[a[i]],co[a[i]]=i,nxt[lst[i]]=i;
if(i>m)
if(nxt[i-m]<i) val=(val-1ll*mi[i-nxt[i-m]-1]*(nxt[i-m]-(i-m))%mo+mo)%mo;
val=val*mi[1]%mo;
if(i-m+1<=lst[i])
if(lst[i]) val=(val+1ll*(i-lst[i]))%mo;
if(i>=m && val==ha) ans[++ans[0]]=i-m+1;
}
printf("%d\n",ans[0]);
for(int i=1;i<=ans[0];i++) printf("%d ",ans[i]);
printf("\n");
}
}
【JZOJ5603】【NOI2018模拟3.27】Xjz的更多相关文章
- 【NOI2018模拟5】三角剖分Bsh
[NOI2018模拟5]三角剖分Bsh Description 给定一个正 n 边形及其三角剖分,共 2n - 3 条边 (n条多边形的边和n-3 条对角线),每条边的长度为 1. 共 q 次询问,每 ...
- JZOJ 5602.【NOI2018模拟3.26】Cti
JZOJ 5602.[NOI2018模拟3.26]Cti Description 有一个 \(n×m\) 的地图,地图上的每一个位置可以是空地,炮塔或是敌人.你需要操纵炮塔消灭敌人. 对于每个炮塔都有 ...
- 【NOI2018模拟】Yja
[NOI2018模拟]Yja Description 在平面上找\(n\)个点,要求这 \(n\)个点离原点的距离分别为 \(r1,r2,...,rn\) .最大化这\(n\) 个点构成的凸包面积,凸 ...
- JZOJ 4269. 【NOIP2015模拟10.27】挑竹签
4269. [NOIP2015模拟10.27]挑竹签 (File IO): input:mikado.in output:mikado.out Time Limits: 1000 ms Memory ...
- 【JZOJ5605】【NOI2018模拟3.26】Arg
题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 解题思路 如何求出一个序列的LIS? 对于二分的方法,每次插入一个数,将它放到第一个 ...
- 【模拟7.27】单(liu_runda学长的神题)
好像用到一些高中数学知识...... 满分做法: case 0:已知a数组求b数组 因为是树状结构,设当前节点x 儿子to 我们从任意一点出发可求出b[root]来,之后我们可以通过寻找两两相连节点的 ...
- 【模拟7.27】题(liu_runda的神题)(卡特兰数,组合数)
考场的SB经验不再分享 case 0: 一道组合计数的水题,具体不再讲可以看以前的相似题 case 1: 很明显的卡特兰计数,我们把长度为n的序列看成01串 关于卡特兰计数的详细的讲解 由此可知我们需 ...
- [jzoj]4271. 【NOIP2015模拟10.27】魔法阵(37种转移的dp)
题意不说 应该这辈子都不会忘记了... 这是我人生中做的最SB的一道DP题. 真的打的我心态崩了.... 可是竟然被我调出来了..... 也是没谁了... 我们设\(F[i][j][S]\)表示到第\ ...
- jzoj5980. 【WC2019模拟12.27】字符串游戏
首先发现双方可以有一个默契,不管谁刻意,都可以把串变为诸如\(...101010101...\)的形式 所以先手要赢的话就是要在上面的基础之上加一个字符使其变为要求的子串 那么就是要求的子串中相邻两个 ...
随机推荐
- 灾备系统 RTO与RPO
出处: https://blog.51cto.com/se7en/1085442 http://www.iso27001.org.cn/fuwu/it/iso22301/show_511.html h ...
- Elastic Search中Query String常见语法
1 搜索所有数据timeout参数:是超时时长定义.代表每个节点上的每个shard执行搜索时最多耗时多久.不会影响响应的正常返回.只会影响返回响应中的数据数量.如:索引a中,有10亿数据.存储在5个s ...
- 界面(UI)测试基础
界面测试,在web程序雏形后就持续测试到项目交付. 项目中的界面测试 此刻需要感慨下“产品经理”的重要性:没有产品把关整个项目,做出来的东西只能叫做“程序”而非“产品” 有产品的工作流,测试在界面测试 ...
- 深入理解计算机系统 第十一章 网络编程 part2 第二遍
客户端和服务器通过因特网这个全球网络来通信.从程序员的观点来看,我们可以把因特网看成是一个全球范围的主机集合,具有以下几个属性: 1.每个因特网主机都有一个唯一的 32 为名字,称为它的 IP 地址 ...
- 《深入实践C++模板编程》之四——特例
1. 所谓模板特例,是针对符合某种条件的模板参数值集合另外声明的模板实现变体. template<typename T> class my_vector; template<> ...
- JS基础_相等运算符
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- linux系统TCP协议之Send(转)
tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- 03 Go语言特性
一.基本注意事项 1.转义字符 \t 一个制表符,代表一次tab \n 换行符 \\ 转义代表 \ \" 转义代表 " \r 一个回车,从当前行的最前面开始输出,会覆盖以前的内容, ...
- MySQL四舍五入函数ROUND(x)、ROUND(x,y)和TRUNCATE(x,y)
MySQL四舍五入函数ROUND(x) ROUND(x)函数返回最接近于参数x的整数,对x值进行四舍五入. 实例: 使用ROUND(x)函数对操作数进行四舍五入操作.SQL语句如下: mysql> ...
- vue项目默认IE以最高级别打开
只需要在index.html加入 <meta http-equiv="X-UA-Compatible" content="IE=Edge">