【未完】训练赛20190304:KMP+树状数组+线段树+优先队列
头炸了啊,只做出L题,前两天刚看的Shawn zhou的博客学习的,幸亏看了啊,否则就爆零了,发现题目都是经典题,线段树,KMP,我都没看过,最近又在复习考研,真后悔大一大二没好好学习啊,得抽时间好好补一下了。还报名了蓝桥杯啊,心里好没底。。。
| # | Title |
|---|---|
| A | Watto and Mechanism |
| B | Infinite Inversions |
| C | Pashmak and Parmida's problem |
| D | Balanced Lineup |
| E | Snowflake Snow Snowflakes |
| F | 敌兵布阵 |
| G | Oulipo |
| H | Power Strings |
| I | Period |
| J | Hat’s Words |
| K | Black Box |
| L | 搬果子 |
G:KMP经典题
称长的为文本串,短的为模式串,求文本串中含有多少模式串。KMP的经典题,主要就是一个next[]数组,next[]数组记录字符串的前后缀相同个数,都在注释里了。
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
const int maxn = 1e6;
string tex, pat; //tex文本串 pat模式串
int nex[maxn]; void getnext(string pat, int lenpat) { //获取nex数组
int j = nex[0] = -1; //j相当于记录nex[i]的值
for (int i = 1; i < lenpat; i++) { //求next[1]~next[len-1]
while (j != -1 && pat[i] != pat[j + 1]) {
j = nex[j]; //j回退,直到j回退到-1或pat[i]==pat[j+1]
}
if (pat[i] == pat[j+1])j++; //相等,先令j指向这个位置。
nex[i] = j; //赋值给nex[i]
}
} int kmp(string tex, string pat) {
int lent = tex.size(), lenp = pat.size();
getnext(pat,lenp); //获取模式串的nex[]数组
int cnt = 0, j = -1; //cnt:成功匹配次数
for (int i = 0; i < lent; i++) { //试图匹配tex
// cout << "i= " << i << endl;
while (j != -1 && tex[i] != pat[j + 1]) {
j = nex[j]; //j回退,直到j回退到-1或pat[i]==pat[j+1]
}
if (tex[i] == pat[j + 1])
j++; //匹配的话,继续
if (j == lenp-1)
/* cout << i+2-lenp<< "\n",*/cnt++, j = nex[j]; //i下标从零开始的,应该属输出 i+1-(lenp)+1
}
return cnt;
} int main() {
int t;
cin >> t;
while (t--) {
cin >> pat>>tex;
int lenp = pat.size(); cout << kmp(tex, pat) << "\n";
}
//for (int i = 0; i < lenp; i++)
// cout << nex[i]+1 << " ";
return 0;
}
H:KMP求循环节
主要是对next[]数组的应用,重点是判断循环节,然后求循环次数。
#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
const int maxn = 1e6;
string tex, pat; //tex文本串 pat模式串
int nex[maxn]; void getnext(string pat, int lenpat) { //获取nex数组
int j = nex[0] = -1; //j相当于记录nex[i]的值
for (int i = 1; i < lenpat; i++) { //求next[1]~next[len-1]
while (j != -1 && pat[i] != pat[j + 1]) {
j = nex[j]; //j回退,直到j回退到-1或pat[i]==pat[j+1]
}
if (pat[i] == pat[j+1])j++; //相等,先令j指向这个位置。
nex[i] = j; //赋值给nex[i]
}
} int main() {
string s;
while (cin >> s&&s[0] != '.') {
int lens = s.size();
getnext(s, lens);
if (lens % (lens - nex[lens-1]-1) == 0) //重点是判断是否能够循环节,循环节:lens-(nex[lens-1]+1)
cout << lens / (lens - nex[lens-1]-1) << "\n";
else cout << "1\n";
}
return 0;
}
I:Period :KMP
L:优先队列 小顶堆
注意头文件,greater<>的头文件 #include<functional> 和 priority_queue<int,vector<int>,greater<int> >p; 别写错了。
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<functional>
using namespace std;
#define ll long long int main() {
int n;
while (cin >> n) {
int t, cnt = 0;
priority_queue<int,vector<int>,greater<int> >p;
for (int i = 0; i < n; i++) {
cin >> t;
p.push(t);
}
while (p.size() != 1) {
int p1 = p.top();
p.pop();
int p2 = p.top();
p.pop();
cnt += p1 + p2;
p.push(p1 + p2);
}
cout << cnt<<"\n";
}
return 0;
}
【未完】训练赛20190304:KMP+树状数组+线段树+优先队列的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- CodeForces–830B--模拟,树状数组||线段树
B. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 树状数组 && 线段树
树状数组 支持单点修改 #include <cstdio> using namespace std; int n, m; ], c[]; int lowbit(int x) { retur ...
- [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?
其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...
- 差分+树状数组 线段树【P2357】 守墓人
题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...
- HDU 5293 Train chain Problem - 树链剖分(树状数组) + 线段树+ 树型dp
传送门 题目大意: 一颗n个点的树,给出m条链,第i条链的权值是\(w_i\),可以选择若干条不相交的链,求最大权值和. 题目分析: 树型dp: dp[u][0]表示不经过u节点,其子树的最优值,dp ...
随机推荐
- 轻量ORM-SqlRepoEx (十)SqlRepoEx Nuget包下载说明
ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...
- Objective-C 中的 assign, copy,retain,strong,weak 详解
在IOS开发中,经常会使用 @property(nonatomic,copy)NSString * name; 语句来快速设置set get 方法,在此依次说明atomic .nonatomi ...
- MySQL必知必会 读书笔记一:简介
了解数据库 数据库(database) 数据库(database) 保存有组织的数据的容器(通常是一个文 件或一组文件). 数据库软件应称为DBMS(数据库管理系统).数据库是通过DBMS创建和操纵的 ...
- SpringBoot整合Swagger2以及生产环境的安全问题处理
1.创建springboot项目 https://www.cnblogs.com/i-tao/p/8878562.html 这里我们使用多环境配置: application-dev.yml(开发环境) ...
- vue调用豆瓣API加载图片403问题
"豆瓣API是有请求次数限制的”,这会引发图片在加载的时候出现403问题,视图表现为“图片加载不出来”,控制台表现为报错403. 其实是豆瓣限制了图片的加载,我自己用了一个办法把图片缓存下来 ...
- TypeScript 运算符
应用场景(待完善) 位运算符 运算符 描述 例子 类似于 结果 十进制 & AND,按位与处理两个长度相同的二进制数,两个相应的二进位都为 1,该位的结果值才为 1,否则为 0. x = 5 ...
- 献给初学者:小白该如何学习Linux操作系统
一. 选择适合自己的Linux发行版 谈到linux的发行版别,太多了,可能谁也不能给出一个准确的数字,但是有一点是能够必定的,linux正在变得越来越盛行, 面临这么多的Linux 发行版,打算从别 ...
- C语言实例解析精粹学习笔记——19
实例19:判断正整数n的d进制表示形式是否是回文数(顺着看和倒着看相同的数). 主要思路: 一种方法:将正整数n数转换成d进制的数,逐个比较首尾对应数字,判断是否为回文数. 另一种方法:将正整数n数转 ...
- python类的封装
Python之类的封装 1. 什么是封装 装:往容器/名称空间里存入名字 封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内(怎么做到的,在下文解释) 2. 为何要封装 封数据属性:不想要给 ...
- python类的多态
1. 什么是多态 多态指的是同一种/类事物的不同形态 2. 为何要用多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 ...