头炸了啊,只做出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+树状数组+线段树+优先队列的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. CodeForces–830B--模拟,树状数组||线段树

    B. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  7. 树状数组 && 线段树

    树状数组 支持单点修改 #include <cstdio> using namespace std; int n, m; ], c[]; int lowbit(int x) { retur ...

  8. [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

    其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...

  9. 差分+树状数组 线段树【P2357】 守墓人

    题目描述-->p2357 守墓人 敲了一遍线段树,水过. 树状数组分析 主要思路: 差分 简单介绍一下差分(详细概念太麻烦,看下面. 给定一个数组 7 8 6 5 1 8 18 20 35 // ...

  10. HDU 5293 Train chain Problem - 树链剖分(树状数组) + 线段树+ 树型dp

    传送门 题目大意: 一颗n个点的树,给出m条链,第i条链的权值是\(w_i\),可以选择若干条不相交的链,求最大权值和. 题目分析: 树型dp: dp[u][0]表示不经过u节点,其子树的最优值,dp ...

随机推荐

  1. 轻量ORM-SqlRepoEx (十)SqlRepoEx Nuget包下载说明

    ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...

  2. Objective-C 中的 assign, copy,retain,strong,weak 详解

    在IOS开发中,经常会使用   @property(nonatomic,copy)NSString * name;   语句来快速设置set get 方法,在此依次说明atomic .nonatomi ...

  3. MySQL必知必会 读书笔记一:简介

    了解数据库 数据库(database) 数据库(database) 保存有组织的数据的容器(通常是一个文 件或一组文件). 数据库软件应称为DBMS(数据库管理系统).数据库是通过DBMS创建和操纵的 ...

  4. SpringBoot整合Swagger2以及生产环境的安全问题处理

    1.创建springboot项目 https://www.cnblogs.com/i-tao/p/8878562.html 这里我们使用多环境配置: application-dev.yml(开发环境) ...

  5. vue调用豆瓣API加载图片403问题

    "豆瓣API是有请求次数限制的”,这会引发图片在加载的时候出现403问题,视图表现为“图片加载不出来”,控制台表现为报错403. 其实是豆瓣限制了图片的加载,我自己用了一个办法把图片缓存下来 ...

  6. TypeScript 运算符

    应用场景(待完善) 位运算符 运算符 描述 例子 类似于 结果 十进制 & AND,按位与处理两个长度相同的二进制数,两个相应的二进位都为 1,该位的结果值才为 1,否则为 0. x = 5 ...

  7. 献给初学者:小白该如何学习Linux操作系统

    一. 选择适合自己的Linux发行版 谈到linux的发行版别,太多了,可能谁也不能给出一个准确的数字,但是有一点是能够必定的,linux正在变得越来越盛行, 面临这么多的Linux 发行版,打算从别 ...

  8. C语言实例解析精粹学习笔记——19

    实例19:判断正整数n的d进制表示形式是否是回文数(顺着看和倒着看相同的数). 主要思路: 一种方法:将正整数n数转换成d进制的数,逐个比较首尾对应数字,判断是否为回文数. 另一种方法:将正整数n数转 ...

  9. python类的封装

    Python之类的封装 1. 什么是封装 装:往容器/名称空间里存入名字 封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内(怎么做到的,在下文解释) 2. 为何要封装 封数据属性:不想要给 ...

  10. python类的多态

    1. 什么是多态     多态指的是同一种/类事物的不同形态   2. 为何要用多态     多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象     多态性的精髓:统一   ...