Description

给定字符串 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 匹配.

Input

第一行两个整数 T(T<=3),C, 分别表示数据组数与字符集大小.
对于每组数据, 第一行两个整数 n,m, 分别表示 S,T 的长度.
第二行 n 个整数, 第 i 个整数表示 S i .
第三行 m 个整数, 第 i 个整数表示 T i .

Output

对于每组数据输出两行, 第一行一个整数 k 表示匹配的个数.
第二行 k 个整数表示匹配的子串在 S 中的开始位置 (下标从 1 开始), 升序排列.

Sample Input

3 3
6 3
1 2 1 2 3 2
3 1 3
6 3
1 2 1 2 1 2
3 1 3
6 3
1 1 2 1 2 1
3 1 3

Sample Output

3
1 2 4
4
1 2 3 4
3
2 3 4

Data Constraint

对于前 10% 的数据, n,m,C ≤ 1000;
对于前 30% 的数据, n,m ≤ 100000, C ≤ 40;
对于前 60% 的数据, n,m,C ≤ 100000;
对于 100% 的数据, n,m,C ≤ 1000000.

题解

S与T匹配就等同于它们每个位置距离相邻的与它们相同的数的距离相同。
而T是固定的,用哈希。

匹配的时候要注意一个问题,
就是S中,在某个前面的最近的可能超出了枚举到的开头位置,
那么就应该将这个位置的距离设为0。

code

#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <time.h>
#define ll long long
#define N 1000003
#define M 103
#define db double
#define P putchar
#define G getchar
#define mo 998244353
using namespace std;
char ch;
void read(int &n)
{n=0;ch=G();while((ch<'0' || ch>'9') && ch!='-')ch=G();ll w=1;if(ch=='-')w=-1,ch=G();while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G();n*=w;
}int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
ll abs(ll x){return x<0?-x:x;}
ll sqr(ll x){return x*x;}
void write(ll x){if(x>9) write(x/10);P(x%10+'0');}int s[N],t[N],k;
int T,c,n,m,lst[N],p1[N],p2[N];
int ans[N],ss[N],tt[N],p[N],x,y;
ll sum,S,z[N];
bool pd;void get(int n,int* s,int* nxt)
{memset(lst,0,sizeof(lst));for(int i=n;i;i--)nxt[i]=lst[s[i]],lst[s[i]]=i;
}int main()
{read(T),read(c);for(;T;T--){read(n);read(m);z[0]=1;ans[0]=0;for(int i=1;i<=1000000;i++)z[i]=z[i-1]*n%mo;for(int i=1;i<=n;i++)read(s[i]);for(int i=1;i<=m;i++)read(t[i]);get(n,s,p1);get(m,t,p2);memset(ss,0,sizeof(ss));memset(tt,0,sizeof(tt));for(int i=1;i<=n;i++)ss[p1[i]]=i;for(int i=1;i<=m;i++)tt[p2[i]]=i;sum=S=0;for(int i=1;i<=m;i++)p[i]=tt[i]?i-tt[i]:0,sum=(sum*n%mo+p[i])%mo;for(int i=1;i<m;i++)p[i]=ss[i]?i-ss[i]:0,S=(S*n%mo+p[i])%mo;for(int i=m;i<=n;i++){x=i-m;p[i]=ss[i]>x?i-ss[i]:0;S=(S-p[x]*z[m-1]%mo+mo)%mo;if(p1[x]<=i){if(p1[x]<i)S=(S-z[i-p1[x]-1]*p[p1[x]]%mo+mo)%mo;p[p1[x]]=0;}S=(S*n%mo+p[i])%mo;if(S==sum)ans[++ans[0]]=x+1;}write(ans[0]);P('\n');for(int i=1;i<=ans[0];i++)write(ans[i]),P(' ');P('\n');}return 0;
}

JZOJ5603. 【NOI2018模拟3.27】Xjz相关推荐

  1. JZOJ 5603. 【NOI2018模拟3.27】Xjz

    Description 给定字符串 S 和 T. 串A和串B匹配的定义改为:存在一个字符的映射,使得A应用这个映射之后等于B,且这个映射必须为一个排列. A=121, B=313,当映射为{1-> ...

  2. JZOJ 5606. 【NOI2018模拟3.27】Yja

    Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r 1 ,r 2 ,-,r n . 最大化这 n 个点构成的 凸包面积, 凸包上的点的顺序任意.不要求点全部在凸包上 ...

  3. 九星连珠用c语言编程,王者模拟战27号更新:九星连珠不再是梦想 贪婪天赋荣升A级...

    原标题:王者模拟战27号更新:九星连珠不再是梦想 贪婪天赋荣升A级 个人观点:王者荣耀模拟战中要实现三星英雄九星连珠的梦想很难,原因是没有大量金币支持玩家抽卡升三星,而恰恰有天赋贪婪可以轻松实现这个梦 ...

  4. JZOJ 5623. 【NOI2018模拟4.2】program

    Description Input Output Sample Input 10 5 8>6<2<>54< 4 7 1 10 4 4 2 9 8 10 Sample Ou ...

  5. JZOJ 5982. 【WC2019模拟12.27】路径排序

    Description Input Output Sample Input 输入1: 5 3 1 1 4 4 2 1 5 4 3 1 3 1 4 2 4 3 2 输入2: 10 5 4 10 3 6 ...

  6. JZOJ 5931. 【NOIP2018模拟10.27】冒泡排序

    Description 题目背景 冒泡排序的交换次数被定义为交换过程的执行次数. 题面描述 小 S 开始专注于研究⻓度为 n 的排列,他想知道,在你运气足够好的情况下(即每次冒泡排序的交换次数都是可能 ...

  7. JZOJ 5933. 【NOIP2018模拟10.27】百鸽笼

    Description Input 从文件 pigeon.in 中读入数据. 输入第一行包含两个正整数 n, m ,分别表示初始鸽笼数与操作个数. 第二行包含 n 个正整数,第 i 个数表示从左往右第 ...

  8. JZOJ 5932. 【NOIP2018模拟10.27】情报中心

    Description 题目背景 .飞纷火战来年近国 D 和国 C .飞乱子鸽来年近国 D 和国 C 题面描述 最近,C 国成功地渗透进入了 D 国的一个城市.这个城市可以抽象成一张有 n 个节点,节 ...

  9. JZOJ 5643. 【NOI2018模拟4.10】最小代价

    Description 给定一张n个点m条边的无向图,点编号1到n,每个点x有两个权值ax和bx.给定k,选出图中一个大小为k的点集S,使得S中任意两个点之间存在仅经过这个点集中的点的路径.S也存在两 ...

  10. JZOJ 5640. 【NOI2018模拟4.9】劈配

    Description Input Output 输出到文件 mentor.out 中. 按顺序输出每组数据的答案.对于每组数据,输出 2 行: • 第 1 行输出 n 个用空格隔开的正整数,其中第 ...

最新文章

  1. JScript Array对象的几个原型方法
  2. 6425C-Lab11 配置DNS
  3. 【机器学习】用摸鱼学来解释隐马尔可夫模型(HMM)
  4. 分布式文件系统之Tachyon是什么?
  5. 一种类的渐进式开发写法
  6. NameNode之DataNode管理
  7. 2020-11-11
  8. InteliJ Idea通过maven创建webapp
  9. 【工具】JAVA 在单元读取文件并比较
  10. 二维光子晶体带隙仿真Matlab完全程序_平面波展开法
  11. Allegro 拼板
  12. Java制作数独小游戏
  13. Chrome启动参数大全
  14. LayerCAM:Exploring Hierarchical Class Activation Maps for Localization
  15. 交换机和路由器的登陆与管理
  16. 这台计算机没有连接到网络怎么办,通过路由器连接电脑连不上网怎么办_台式连接路由器没有网解决方法-系统城...
  17. 打印和显示的字体种类
  18. VC中CTime和SYSTEMTIME转化
  19. 医院招聘计算机管理岗考试题库13套
  20. BBC:关于睡眠你应该知道的十件事

热门文章

  1. 跨文化的交流---黄金周的收获
  2. C#,入门教程(43)——字节、字符、字符串及操作函数之基础知识总结与实例源代码(2023清明之作)
  3. 腾讯云服务器标准型S2和标准型SA2区别在哪?如何选择?
  4. JVM学习(5)-- JVM参数及分析工具
  5. winpcap无法下载
  6. 从入门到入土:学习|实例练手|获取裁判决定网|Selenium出击|绕过反爬机制|实现批量下载裁决书|狗头保命|仅用于学习交流|Selenium自动化操作
  7. 写一个APP的ui自动化脚本
  8. 今天晚上要去新东方听讲座了
  9. 听大数据讲座有关记录
  10. 网络攻击是如何运作的—一份完整的列表 ( 1 )