HDU 1711(KMP)字符串匹配
KMP 算法
我以自己理解写的,写的不对,不明白的地方海王子出来,一起共同学习;
字符串匹配 就是KMP,一般思想,用一个for循环找开头 如果开头一样进入第二个for循环;这样统计 直观 容易理解。但是时间复杂度比较长。所以就有KMP 这个算法了
KMP 大体思想因为在上一个方法之中,有的字符重复比较了,使得找到目标字符窜效率比较低,
比如 :目标串为: ① a b a b c
在 ② a b a a b a b c d a b c d b c 这个字符窜中找到上述目标串;
如用 i,j 来表示①,②两个字符串的下标,假设下标从一开始;
i=1,j=1 a=a;
i=2,j=2 b=b;
i=3,j=3 a=a;
i=4;j=4 b!=a; 此时如果只将①字符串右移动一位,虽然可以;但是,假如你移动两位看看怎么样?
a b a b c
a b a a b a b c d a b c d b c
是不是觉得移动2格对得非常整齐?
那么为什么移动两个?
第3个a与第一个a正好重复!所以我们知道重复单元就知道移动多少。需要一个数组记录当两个字符不相等,i 应该指向哪个!记录重复单元的值,叫做部分匹配值!不懂可以百度部分匹配值!以上就是KMP 核心思想
下面贴一个代码!!两种写法!//屏蔽是另一种写法
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- int N[1000005],M[10005],a[10005],n,m;
- void set_a()
- {
- int i,j;
- a[1]=0;
- j=1;
- for(i=2; i<=m; i++)
- {
- if(M[j]==M[i])
- {
- a[i]=j;
- j++;
- }
- else if(M[j]!=M[i]&&M[i]==M[1])
- {
- a[i]=1;
- j=2;
- }
- else
- {
- a[i]=0;
- j=1;
- }
- }
- // for(i=1; i<=m; i++)
- // printf("%d ",a[i]);
- // printf("\n");
- }
- int kmp()
- {
- int i=1,j=1,k;
- set_a();
- while(i<=n)
- {
- if(j==1&&N[i]!=M[j]) i++;
- if(N[i]==M[j])
- {
- i++;
- j++;
- }
- else j=a[j-1]+1;
- if(j==m+1) return i-m;
- }
- return -1;
- }
- int main()
- {
- int t;
- scanf("%d",&t);
- while(t--)
- {
- //int b; scanf("%d",&b);
- int i;
- scanf("%d%d",&n,&m);
- memset(a,0,sizeof(a));
- for(i=1; i<=n; i++)
- scanf("%d",&N[i]);
- for(i=1; i<=m; i++)
- scanf("%d",&M[i]);
- printf("%d\n",kmp());
- }
- return 0;
- }
- ///**********************KMP****************************/
- //
- //#include<stdio.h>
- //#include<string.h>
- //using namespace std;
- //int lena,lenb;
- //int a[1000005],b[10005];
- //int next[200000];
- //void set_naxt()//子串的next数组
- //{
- // int i=0,j=-1;
- // next[0]=-1;
- // while(i<lenb)
- // {
- // if(j==-1||b[i]==b[j])
- // {
- // i++;
- // j++;
- // next[i]=j;
- // }
- // else
- // j=next[j];
- // }
- // // printf(">>%d\n",next[lenb-1]);
- // for(i=1; i<=lenb; i++)
- // printf("%d ",next[i]);
- // printf("\n");
- //}
- //
- //int kmp()
- //{
- // int i=0,j=0;
- // set_naxt();
- // while(i<lena)
- // {
- // if(j==-1||a[i]==b[j])
- // {
- // i++;
- // j++;
- // }
- // else
- // j=next[j];
- // if(j==lenb)
- // return i-j+1;
- // }
- // return -1;
- //}
- //int main()
- //{
- // int i,t;
- // scanf("%d",&t);
- // while(t--)
- // {
- // memset(next,0,sizeof(next));
- // scanf("%d%d",&lena,&lenb);
- // for(i=0; i<lena; i++)
- // scanf("%d",&a[i]);
- // for(i=0; i<lenb; i++)
- // scanf("%d",&b[i]);
- // printf("%d\n",kmp());
- // }
- //}
HDU 1711(KMP)字符串匹配的更多相关文章
- {Reship}{KMP字符串匹配}
关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827
- 洛谷P3375 - 【模板】KMP字符串匹配
原题链接 Description 模板题啦~ Code //[模板]KMP字符串匹配 #include <cstdio> #include <cstring> int cons ...
- Luogu 3375 【模板】KMP字符串匹配(KMP算法)
Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- P3375 【模板】KMP字符串匹配
P3375 [模板]KMP字符串匹配 https://www.luogu.org/problemnew/show/P3375 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在 ...
- 洛谷—— P3375 【模板】KMP字符串匹配
P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如 ...
- P3375 模板 KMP字符串匹配
P3375 [模板]KMP字符串匹配 来一道模板题,直接上代码. #include <bits/stdc++.h> using namespace std; typedef long lo ...
- KMP字符串匹配 模板 洛谷 P3375
KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...
- KMP字符串匹配学习
KMP字符串匹配学习 牛逼啊 SYC大佬的博客
- hdu 1711 KMP算法模板题
题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...
随机推荐
- 转载 gdb调试程序
转载自csdn,作者haoel,链接http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一 ...
- Python入门--13--递归
什么是递归: 有调用函数自身的行为 有一个正确的返回条件 设置递归的深度: import sys sys.setrecursionlimit(10000) #可以递归一万次 用普通的方法也就是非递归版 ...
- c++ 高效并发编程
高效并发编程 并发编程的基本模型包括,通过消息机制来管理运行顺序的message passing, 通过互斥保护共享的shared memory. 线程同步的基本原则 最低限度共享变量,考虑使用imm ...
- BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
题目链接 BZOJ 3675 首先最后的答案和分割的顺序是无关的, 那么就可以考虑DP了. 设$f[i][j]$为做了$i$次分割,考虑前$j$个数之后的最优答案. 那么$f[i][j] = max( ...
- input标签附带提示文字(bootstrap里面输入框的两侧同时添加额外元素)
一直不太喜欢用定位,今天写界面的时候,要在输入框右边添加默认的元素符号. 第一次尝试,因为本身项目用的是bootstrap所以就想利用输入框的两侧同时添加额外元素. 但是写了代码发现效果不同. 第二次 ...
- 深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)
在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多 ...
- CSS 的导入方式 (link or import ?)
前言 最常看见的CSS的使用方式有三种 1. 在span, div 等标签上直接使用 style 属性定义CSS <span style="color:blue">Th ...
- UVA 1356 - Bridge(自适应辛普森)
UVA 1356 - Bridge option=com_onlinejudge&Itemid=8&page=show_problem&category=493&pro ...
- java 短信猫发送短信的方法
用java实现短信收发的功能,目前一般项目中短信群发功能的实现方法大致有下面三种: · 1. 向运行商申请短信网关,不需要额外的设备,利用运行商提供的API调用程序发送 ...
- 1 npoi 网上 不用模板 设置密码 workbook.WriteProtectWorkbook("password", "admin"); 、、 2 locked.IsLocked = true; sheet1.ProtectSheet("password");NPOI操作EXCEL--设置密码才可以修改单元格内容 3 模板设置密码 确定原密码 设置新密码
1 workbook.WriteProtectWorkbook("password", "admin"); 还是可以进去 只读进去 可以编辑 编辑就另存为 ...