HDU 1711 kmp模板题

http://acm.hdu.edu.cn/showproblem.php?pid=1711

#include<stdio.h>
#include<string.h>
#define N 1000005
int s[N];
int p[N];
int next[N];
int m,n;
void getnext(){int j=0,k=-1;next[0]=-1;while(j<m){if(k==-1||p[j]==p[k]){j++;k++;next[j]=k;}elsek=next[k];}
}
int kmp(){int i=0,j=0;getnext();while(i<n){if(j==-1||s[i]==p[j]){i++;j++;}elsej=next[j];if(j==m)return i;}return -1;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++)scanf("%d",&s[i]);for(int i=0;i<m;i++)scanf("%d",&p[i]);if(kmp()==-1)printf("-1\n");elseprintf("%d\n",kmp()-m+1);}return 0;
}

HDU1686

http://acm.hdu.edu.cn/showproblem.php?pid=1686

题意就是,给你一个字符串A,一个字符串B,求A在B中总共出现了几次,注意,重复的也算。

稍微改动即可。

HDU 2087 剪花布条(KMP:贪心)

http://acm.hdu.edu.cn/showproblem.php?pid=2087

直接用KMP算法,用T模式串去匹配S主串即可,但是当匹配成功的时候要看看当前匹配点离上一个匹配点是不是距离差>=T的长度。

贪心,从左向右依次选取即可,证明略。

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=1000+100;
char S[MAXN],T[MAXN];
int next[MAXN];
int n,m;
int cnt,last;
void getFail()
{next[0]=next[1]=0;for(int i=1;i<m;i++){int j=next[i];while(j && T[i]!=T[j]) j=next[j];next[i+1] = (T[i]==T[j])?j+1:0;}
}
void KMP()
{n=strlen(S);m=strlen(T);getFail();int j=0;for(int i=0;i<n;i++){while(j && S[i]!=T[j]) j=next[j];if(S[i]==T[j]) j++;if(j==m){if(cnt==0){cnt++;last=i;//last指向匹配位置的末尾}else if(i-last>=m){cnt++;last=i;}}}
}
int main()
{while(scanf("%s",S)==1){if(strcmp(S,"#")==0)break;scanf("%s",T);cnt=0;KMP();printf("%d\n",cnt);}return 0;
}

HDU3746 next应用

http://acm.hdu.edu.cn/showproblem.php?pid=3746

逻辑就是找到最长相同前后缀再在后面加上那一段就找到了.

注意:用原始next,next数组存的是前缀和后缀的最大匹配值,

比如abcabca

改进前最后一个字符next[7]=4,表示的是前缀和后缀最大匹配是4,即abca和abca。

改进后的next[7]=-1。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100010char s[N];
int nextval[N];
int len;void getnext(const char *s)
{int i = 0, j = -1;nextval[0] = -1;while(i != len){if(j == -1 || s[i] == s[j])nextval[++i] = ++j;elsej = nextval[j];}
}int main()
{int ncase;int length, add;scanf("%d", &ncase);while(ncase--){scanf("%s", s);len = strlen(s);getnext(s);/*for(int i = 0; i <= len; ++i) //查看next数组的内容cout<<nextval[i]<<" ";cout<<endl;*/length = len - nextval[len]; //循环节的长度if(len != length && len % length == 0) //循环多次printf("0\n");else{add = length - nextval[len] % length; //取余的作用:abcab,去掉abcprintf("%d\n",add);}}return 0;
}

kmp1-HDU1711 HDU1686 HDU2087 HDU3746相关推荐

  1. 做题记录(2019年2月10日起)

    开个博客记录一下自己做过的题: 2019年: 2月: UVA10082 (字符串常量水题) https://vjudge.net/problem/UVA-10082 UVA272 (字符串替换水题) ...

  2. HDU2087 剪花布条【KMP】

    剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  3. hdu2087 剪花布条 暴力/KMP

    在字符串中不可重叠地寻找子串数量,暴力/KMP 1 #include<stdio.h> 2 #include<string.h> 3 4 int main(){ 5 char ...

  4. hdu1711 KMP模板

    题意:      给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的.. 思路:       裸的KMP,也是我的第一个KMP,说下对KMP的理解吧,首先对于非优化的方法求匹配,时间复杂度应 ...

  5. hdu1686 最大匹配次数 KMP

    题意:      给你两个串,问你串a在串b中出现了多少次. 思路:       直接匹配,KMP时匹配到匹配串的最后一个的时候不用跳出,直接匹配就行了,最后一个'/0'不会和目标串匹配,所以经过ne ...

  6. hdu3746 KMP的next数组应用,求项链首尾项链循环

    题意:       给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连) 思路:      KMP的简单应用只要了解next数组的意义就好说了,下面总结下  next在循环方面 ...

  7. HDU2087剪花布条

    Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入 ...

  8. hdu1686:KMP板子

    题目链接 题目大意就是给你两个字符串,求出第一个字符串在第二个字符串中出现的次数. 如果我们暴力匹配的话,复杂度是 len(first) * len(second) 对于题目给的 1e4 * 1e6 ...

  9. 剪花布条(HDU-2087)

    Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入 ...

最新文章

  1. ARM的突破:超级计算机和Mac
  2. 关于运行SWT程序遇到的一个错误的总结
  3. 基于深度学习和机器学习的心电图智能分析参赛总结
  4. Angular应用里使用rxjs提供的观察者和发布者实现事件处理
  5. java清屏_【图片】请问java编写中如何做到清屏啊。。。_java吧_百度贴吧
  6. Java基础(五):数组和Java方法
  7. Azure database
  8. ionic3学习之懒加载
  9. System.SetString - 获取字符串
  10. 五大常用算法之回溯法
  11. 调度算法——时间片轮转、优先级、多级反馈队列(例题详细!!!)
  12. WPS for Linux(ubuntu)字体配置(字体缺失解决办法)
  13. 一周热图|何穗俞飞鸿张翰南京出席活动;华为全球最大旗舰店开业;巴黎欧莱雅公布凯瑟琳·兰福德为全球代言人...
  14. 计算机cpu占用率高,CPU占用率高怎么解决?Win10系统电脑CPU占用率100%的解决方法...
  15. 个人信息提取(字符串)
  16. purifier用来过滤危险的标签xss
  17. python爬虫猫眼电影票房_python爬取猫眼电影top100排行榜
  18. Java DOM4J解析String类型XML,Document对象转String
  19. Arduino DRV8825驱动两相步进电机
  20. Tableau使用笔记

热门文章

  1. 算法的时间复杂度和空间复杂度评估
  2. CSS 美化网页元素
  3. 以前在QQ空间上发表的内容
  4. 惠普HP Color Laser 150nw 打印机驱动
  5. 修改Win7工具栏资源管理器打开后的默认路径
  6. 普通pc电脑安装苹果系统mac_详细教程(精)附带所有工具下载
  7. 基于Android平台的三维实时全景地图设计与实现(二)
  8. SSM宾馆管理系统(酒店管理系统)
  9. 研究生复试中的一些问题回答
  10. Google Chrome浏览器、360极速浏览器必备的N个插件