博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P3375 【模板】KMP字符串匹配
阅读量:6720 次
发布时间:2019-06-25

本文共 1215 字,大约阅读时间需要 4 分钟。

题目描述

如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。

为了减少骗分的情况,接下来还要输出子串的前缀数组next。

(如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。)

输入输出格式

输入格式:

 

第一行为一个字符串,即为s1(仅包含大写字母)

第二行为一个字符串,即为s2(仅包含大写字母)

 

输出格式:

 

若干行,每行包含一个整数,表示s2在s1中出现的位置

接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。

 

输入输出样例

输入样例#1: 
ABABABCABA
输出样例#1: 
130 0 1

说明

时空限制:1000ms,128M

数据规模:

设s1长度为N,s2长度为M

对于30%的数据:N<=15,M<=5

对于70%的数据:N<=10000,M<=100

对于100%的数据:N<=1000000,M<=1000000

样例说明:

所以两个匹配位置为1和3,输出1、3

 

比kmp好理解的多

把b串做成一个hash值

在a串中不断的匹配就好

时间复杂度:O(n)O(n)

1 #include
2 #include
3 #include
4 #define ull unsigned long long 5 using namespace std; 6 const int MAXN=2e7+10; 7 const int mod=19260817; 8 const int seed=233; 9 ull po[MAXN];10 ull hash(ull *a,int l,int r)11 {12 if(l-1<0) return a[r];13 return a[r]-po[r-l+1]*a[l-1];14 }15 char s1[MAXN],s2[MAXN];16 ull h1[MAXN],h2;17 int l1,l2;18 int nxt[MAXN];19 int main()20 {21 po[0]=1;22 for(int i=1;i<=10001;i++) po[i]=po[i-1]*seed;23 scanf("%s",s1);scanf("%s",s2);24 l1=strlen(s1);l2=strlen(s2);25 for(int i=0;i
0&&s2[i]!=s2[j]) j=nxt[j-1];35 if(s2[i]==s2[j]) j++;36 nxt[i]=j;37 }//题目中说要输出nxt数组 38 for(int i=0;i

 

转载地址:http://tecmo.baihongyu.com/

你可能感兴趣的文章
OSChina 周二乱弹 —— 好好告别啊!不要舌吻!
查看>>
使用Cygwin和 mingw 安装 python paramiko模块
查看>>
前端那些事之hack篇
查看>>
结合COMSOL,浅谈多场耦合
查看>>
开发人员学Linux(2):VirtualBox中安装CentOS7系统设置
查看>>
HttpURLConnection原生JAVA http請求
查看>>
CentOS/Linux 开放80、8080端口或者开放某个端口
查看>>
Storm配置属性和操作命令
查看>>
react-native-scrollable-tab-view 自定制 tabBar
查看>>
Oracle执行计划 SQL语句执行效率问题查找与解决方法
查看>>
Android ViewFlipper触摸动画
查看>>
开发小组
查看>>
QSsh之SshConnection类
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
二级指针,指针数组和数组指针
查看>>
我的友情链接
查看>>
cobbler之蟒蛇监控实现监控系统安装进度
查看>>
zookeeper 原理(转)
查看>>
我在印尼工作的日子-初来乍到
查看>>