Jzoj5603 xiz

原创 2018年04月17日 21:50:27
给定字符串 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 匹配.

这是一个非常巧妙的题,不仅仅实在kmp那个部分

定义lst[x]表示最大的y使得y<x且s[y]=s[x] 若不存在则为0

显然,两个字符串可以匹配,当且仅当两个串的lst数组可以匹配

这里“匹配”指的是A[i]=B[j] 或者 A[i]=0且B[j]>=i 因为文本串长过模板

那么我们的KMP也要按照这个方式来写就行了(当然完全可以用哈希)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,S[1000010],T[1000010],nt[1000010];
int t,ans[1000010],lst[1000010];
int KMP(){
	scanf("%d%d",&m,&n); t=0;
	memset(lst,-1,sizeof lst);
	for(int x,i=0;i<m;++i){
		scanf("%d",&x);
		if(!~lst[x]) T[i]=0; else T[i]=i-lst[x];
		lst[x]=i;
	}
	memset(lst,-1,sizeof lst);
	memset(nt,0,sizeof nt);
	for(int x,i=0;i<n;++i){
		scanf("%d",&x);
		if(!~lst[x]) S[i]=0; else S[i]=i-lst[x];
		lst[x]=i;
	}
	for(int i=1,j;i<n;++i)
		for(j=i;j;) 
			if(S[j=nt[j]]==S[i] || (S[j]==0 && S[i]>j)){ nt[i+1]=j+1; break; }
	for(int i=0,j=0;i<m;++i){
		if(j<n &&(T[i]==S[j] || (S[j]==0 && T[i]>j))) ++j;
		else while(j){
			j=nt[j];
			if(T[i]==S[j] || (S[j]==0 && T[i]>j)){ ++j; break; }
		}
		if(j==n) ans[++t]=i-n+1;
	}
	printf("%d\n",t);
	for(int i=1;i<=t;++i) printf("%d ",++ans[i]); puts("");
}
int main(){
	freopen("xjz.in","r",stdin);
	freopen("xjz.out","w",stdout);
	int T; scanf("%d%*d",&T);
	while(T--) KMP();
}

版权声明:本文为Cooevjnz原创文章,未经Cooevjnz允许也可以转载! https://blog.csdn.net/JacaJava/article/details/79980141

【JZOJ5603】【NOI2018模拟3.27】Xjz

题目描述 给定字符串 S 和 T。 串A和串B匹配的定义改为:存在一个字符的映射,使得A应用这个映射之后等于B,且这个映射必须为一个排列。 A=121, B=313,当映射为{1-&amp;gt...
  • chen1352
  • chen1352
  • 2018-03-27 16:25:18
  • 53

JZOJ5606. 【NOI2018模拟3.27】Yja

Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r 1 ,r 2 ,…,r n . 最大化这 n 个点构成的 凸包面积, 凸包上的点的顺序任意.不要求点全部在凸...
  • lijf2001
  • lijf2001
  • 2018-03-27 22:38:04
  • 44

[雅礼集训]xiz(字符串匹配)

题目描述: 给定字符串 S 和 T, 定义两个字符串匹配当且仅当每种字符的数量相等, 求 S 的哪些连续子串与 T 匹配. 字符集大小,字符串S,T长度小于等于1...
  • qq_36284842
  • qq_36284842
  • 2018-03-26 22:03:20
  • 57

jzoj5603 xjz

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

JZOJ5603. 【NOI2018模拟3.27】Xjz

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

[JZOJ4837]I Liked Matrix!

题目大意在一个n×mn\times m的矩阵里面所有位置随机填入00或11,概率比为x:yx:y。令Bi=∑mj=1Ai,jB_i=\sum_{j=1}^mA_{i,j},求min{Bi}\min\{...
  • a_crazy_czy
  • a_crazy_czy
  • 2016-11-01 16:22:10
  • 927

一些OpenCV里常用的图像处理

cv篇包含以下几个部分: 图像处理 结构分析 运动分析与对象跟踪 模式识别 相机标定和三维重建   1、图像处理 图像处理主要针对二维像素数组,但是我们称这些数组为“图像”,但是它们...
  • u010076558
  • u010076558
  • 2014-12-28 22:36:55
  • 7095
收藏助手
不良信息举报
您举报文章:Jzoj5603 xiz
举报原因:
原因补充:

(最多只允许输入30个字)