【未完】训练赛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 ...
随机推荐
- 使用java将base64码与图片互转!
本篇文章主要介绍了java 后台将base64字符串保存为图片的方法,现在分享给大家,也给大家做个参考. import java.io.FileInputStream; import java.io. ...
- Linux -- 用户组篇
Linux -- 用户与用户组 1.Linux 系统中有三种角色:所有者(用户),用户组与其他人,一张图可以说明用户与用户组的关系. 如图,某公司相当于一个用户组,该用户组下有A,B两个用户,用户拥有 ...
- sqlplus常用的几种登录方式
1. sqlplus / as sysdba 操作系统认证,sys管理员登录,/后面要有空格. 2. sqlplus "/ as sysdba" 操作系统认证,sys管理员登录,/ ...
- Spring 整合Mybatis dao原始方法
先看一下项目图,基本就理解了整合的内容 这次主角不再是Mybats的配置文件SqlMapConfig.xml了,而是Spring的applicationContext.xml applicationC ...
- 给出一个整数,将这个整数中每位上的数字进行反转(JavaScript编程)
一.问题描述:给出一个整数,将这个整数中每位上的数字进行反转.示例:输入:123,输出321:输入-123,输出-321:输入120,输出-21 二.问题分析与解决: 需要将给出的整数反转,注意示例中 ...
- BufPay.com 个人收款接口 接入步骤
作为独立开发者产品需要收款是非常麻烦的,注册公司维护成本太高,市面上各种收款工具要么手续费太高,要么到账很慢,体验很不好. 看到 「BufPay.com 个人收款」 这个收款工具,挺有意思的.原理是监 ...
- IDEA中使用单元测试@Test等,提示没有 Junit.jar包
1.File-->Project Structure-->Modules-->右侧Dependencies-->+号-->JARs or directories... 2 ...
- SASS实现代码的重用:混合器Mixin、继承
1. 继承: @extend sass允许一个选择器,继承另一个选择器,通过@extend实现 .class1{ border: 1px solid #333; } .class2{ @extend ...
- 剑指Offer-迭代
1.大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0) 备注:斐波那契数列指的是这样一个数列从第3项开始,每一项都等于前两项之和. public st ...
- 推荐软件7 taskbar numberer,结果get了WIN相关的快捷键
作为键盘控,Win+数字直达任务栏上的应用已经让我欣喜.接下来我的问题就是每次要数数字才能确定是哪个数字,期间我尝试过按常用顺序进行排序并尝试记住它们.直到我想也许应该有个软件可以在任务栏图标处贴上一 ...