[ARG] KMP

博客提及字符匹配条件,即两个串中字符相对位置一样就可匹配。针对此问题,可将原串每个字符改成其与上次出现位置的距离,然后使用KMP算法来解决,同时给出了n、m、C的取值范围。

  • n,m,C<=1e6
  • 只要两个串中的字符相对位置一样两个串就可以匹配
  • 所以我们可以把原串每个字符改成他和他上次出现位置的距离
  • 做KMP即可
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=1e6+100;
int pre[N],last[N],ans[N],a[N],b[N],cnt,n,m,T,C;
inline int read(){
	int num=0;char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))num=num*10+ch-'0',ch=getchar();
	return num;
}
inline void Print(int x){if(x>9)Print(x/10);putchar(x%10+'0');}
void init(){
	memset(last,0,sizeof(last));
	memset(pre,0,sizeof(pre));
	cnt=0;
}
void KMP(){
	for(int i=2,j=0;i<=n;i++){
		while(j&&min(j+1,a[i])!=a[j+1])j=pre[j];
		if(min(j+1,a[i])==a[j+1])j++;
		pre[i]=j;
	}
	for(int i=1,j=0;i<=m;i++){
		while(j>0&&(j==n||min(j+1,b[i])!=a[j+1]))j=pre[j];
		if(min(j+1,b[i])==a[j+1])j++;
		if(j==n)ans[++cnt]=i-n+1;
	}
	Print(cnt);puts("");
	rep(i,1,cnt)Print(ans[i]),putchar(' ');
	puts("");
}
int main()
{
	T=read(),C=read();
	while(T--){
		init();
		m=read(),n=read();
		rep(i,1,m)b[i]=read();
		rep(i,1,n)a[i]=read();
		rep(i,1,n){int tmp=a[i];a[i]=i-last[a[i]];last[tmp]=i;}
		memset(last,0,sizeof(last));
		rep(i,1,m){int tmp=b[i];b[i]=i-last[b[i]];last[tmp]=i;}
		KMP();
	}return 0;
}

 

import numpy as np import pandas as pd import matplotlib.pyplot as plt import PIL import torch from torchvision import transforms import torchvision #调用已经训练好的FCN语义分割网络 model = torchvision.models.segmentation.fcn_resnet101(pretrained=True) model.eval() #读取照片 image=PIL.Image.open('1234.jpg') #照片进行预处理 image_transf=transforms.Compose([ transforms.ToTensor(), transforms.Normalize(mean=[0.485,0.456,0.406], std=[0.229,0.224,0.225]) ] ) image_tensor=image_transf(image).unsqueeze(0) output=model(image_tensor)['out'] output.shape #读取图片,进行分割,总共21个通道,因为在21个数据集上训练 #转化为2维图像 outputarg=torch.argmax(output.squeeze(),dim=0).numpy() outputarg def decode_seqmaps(image,label_colors,nc=21): r=np.zeros_like(image).astype(np.uint8) g=np.zeros_like(image).astype(np.uint8) b=np.zeros_like(image).astype(np.uint8) for cla in range(0,nc): idx = image == cla r[idx] = label_colors[cla,0] g[idx] = label_colors[cla,1] b[idx] = label_colors[cla,2] rgbimage= np.stack([r,g,b],axis=2) return rgbimage import os os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE" label_colors =np.array([(0,0,0), #0=background (128,0,0),(0,128,0),(128,128,0),(0,0,128), #1=airplane,2=bicycle,3=bird,4=boat (128,0,128),(0,128,128),(128,128,128),(64,0,0), #6=bus,7=car,8=cat,9=chair (192,0,0),(64,128,0),(192,128,0),(64,0,128), #10=cow,11=dining table,12=dog,13=horse (192,0,128),(64,128,128),(192,128,128),(0,64,0), #14=motorbike,15=person,16=potted plant,17=sheep (128,64,0),(0,192,0),(128,192,0),(0,64,128) #18=sofa,19=train,20=tv/monitor ]) outputrgb=decode_seqmaps(outputarg,label_colors) plt.figure(figsize=(20,8)) plt.subplot(1,2,1) plt.imshow(image) plt.axis('off') plt.subplot(1,2,2) plt.imshow(outputrgb) plt.axis('off') plt.subplots_adjust(wspace=0.05) plt.show()使用了哪些深度学习的模型和方法
04-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值