kmp练习
时间:2019-03-15
本文章向大家介绍kmp练习,主要包括kmp练习使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
先贴个lrj的板子, kmp基本照这个写了, 其中f数组表示失配后应转移的新状态
int main() { scanf("%s%s", t, p); int n = strlen(t), m = strlen(p); f[0]=f[1]=0; REP(i,1,m-1) { int j = f[i]; while (j&&p[i]!=p[j]) j=f[j]; if (p[i]==p[j]) ++j; f[i+1] = j; } int j = 0; REP(i,0,n-1) { while (j&&p[j]!=t[i]) j=f[j]; if (p[j]==t[i]) ++j; if (j==m) printf("%d", i-m+1); } }
练习1: hdu5763
大意: 给定字符串T, 模板串P, 可以将T中与P匹配的子串替换为'*', 求多少种替换方案.
一个板子题, kmp求出可以替换的位置, 然后dp就好了
const int N = 1e6+10; char t[N], p[N]; int f[N], ff[N], *dp=ff+1; void add(int &a, int b) {a+=b;if (a>=P) a-=P;} void work() { scanf("%s%s", t, p); int n = strlen(t), m = strlen(p); f[0]=f[1]=0; REP(i,1,m-1) { int j = f[i]; while (j&&p[i]!=p[j]) j=f[j]; if (p[i]==p[j]) ++j; f[i+1] = j; } int j = 0; dp[-1] = 1; REP(i,0,n-1) { while (j&&p[j]!=t[i]) j=f[j]; if (p[j]==t[i]) ++j; dp[i] = 0; if (j==m) add(dp[i],dp[i-m]); add(dp[i],dp[i-1]); } printf("%d\n",dp[n-1]); } int main() { int t; scanf("%d", &t); REP(i,1,t) printf("Case #%d: ",i),work(); }
练习2 CF825F
大意: 给定字符串$s$, 可以将连续$c1$个相同的子串$s1$压缩为|c1|+|s1|, 求压缩若干次后$s$最短长度.
字符串循环节板子, 假设一个长$n$的字符串$s$, 失配函数为$f$, 则循环节为n-f[n]或n
const int N = 8e3+10; int n; char s[N]; int f[N], g[N][N], ff[N], *dp=ff+1; void getFail(char *s) { int m = strlen(s); f[0]=f[1]=0; REP(i,1,m-1) { int j=f[i]; while (j&&s[i]!=s[j]) j=f[j]; if (s[i]==s[j]) ++j; f[i+1] = j; } } int calc(int x) {int r=0;while (x) ++r,x/=10;return r;} int main() { scanf("%s", s); n = strlen(s); REP(i,0,n-1) { getFail(s+i); REP(j,i,n-1) { int len = j-i+1; if (len%(len-f[len])==0) g[i][j]=len-f[len]+calc(len/(len-f[len])); else g[i][j]=len+1; } } dp[-1] = 0; REP(i,0,n-1) { dp[i] = INF; REP(j,0,i) dp[i] = min(dp[i], dp[j-1]+g[j][i]); } printf("%d\n", dp[n-1]); }
- 使用Ring Buffer构建高性能的文件写入程序
- 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
- PDF.NET数据开发框架实体类操作实例
- 利用Burp Suite对OWASP Juice Shop进行渗透测试
- Java同步问题面试知识学习
- Android UI控件系列:LinearLayout(线性布局)
- 使用操作符重载,生成ORM实体类的SQL条件语句
- Dance In Heap(四):一些堆利用的方法(下)
- Mac系统的Proton恶意软件:卷!土!重!来!
- Erlang语言学习入门
- Android使用Ant进行apk多渠道打包
- Dance In Heap(三):一些堆利用的方法(中)
- Android性能优化篇:使用软引用和弱引用
- 使用泛型委托,构筑最快的通用属性访问器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 聊聊dubbo-go的DubboProtocol
- 推荐一个很牛叉的开源Flask项目
- 机器学习应用资产管理系列一:强化学习策略(附代码)
- 3分钟短文 | Laravel模型关联删除表记录,用观察者还是事件钩子
- 原理+代码|深入浅出Python随机森林预测实战
- 3分钟短文 | Laravel复杂SQL超多WHERE子句,本地作用域你没用过
- 3分钟短文 | Laravel同时连接多个数据库,你用啥办法?
- 3分钟短文 | PHP 连接2个字符串的8个方法,新手常犯错
- nodejs源码分析之connect
- 你应该了解的Nacos配置中心
- Jenkins CLI 命令行 v0.0.30
- 2020新鲜出炉的“面筋”,够刁钻
- Spring注解配置应该怎么玩
- 算法篇:链表之倒数第k个节点
- 彻底搞懂 Java 线程池,干啥都不再发憷