cstring

填坑Ⅰ | 简单的数据结构

别说谁变了你拦得住时间么 提交于 2020-10-01 08:21:04
19. 填坑Ⅰ 成绩 10 开启时间 2020年09月17日 星期四 12:00 折扣 0.8 折扣时间 2020年09月24日 星期四 12:00 允许迟交 否 关闭时间 2020年10月10日 星期六 23:00 Description 又是北湖深坑,惊不惊喜,意不意外?! Rack觉得用水填湖太没意思了,用石头填坑多有意思。假设北湖的地面还是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。现提供不限量的1x2规格的石头,问是否可以将北湖填平。(所有地面到达同一高度即为填平) 注:石头只能水平或垂直填放。 Input 样例有多组输入至文件末尾;每组用例占两行; 第一行输入1个整数n表示北湖地面总宽度; 第二行输入n个整数用空格间隔,表示地面高度。 Output 若能填平则输出“YES”,否则输出“NO”。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 5↵ 2 1 1 2 5↵ 3↵ 4 5 3↵ 3↵ 1 2 3↵ YES↵ YES↵ NO↵ 1秒 64M 0 一、预热知识 在说具体的算法之前,首先我们要知道 栈 这个 数据结构 ,之前在 “括号匹配” 里我已经简单提到过栈。关于栈,你现在只需要知道两点 1、它的特点: 单口出入,先进后出。 2、它的使用 注意,小学期你直接学会c++封装的STL的使用即可,至于它是怎么实现的

模板库

£可爱£侵袭症+ 提交于 2020-09-30 15:58:27
呼,终于在考试之前复习了一遍所有模板。 球NOIP不跪! BigNumber 1 #include <iostream> 2 #include <cstdio> 3 #include < string > 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 const int maxlen= 3100 ; 8 struct bigint 9 { 10 int a[maxlen],len; 11 bigint() 12 { 13 memset(a, 0 , sizeof a); 14 len= 1 ; 15 } 16 bigint( string str) 17 { 18 memset(a, 0 , sizeof a); 19 len= str.length(); 20 for ( int i= 1 ;i<=len;i++)a[i]=str[len-i]- ' 0 ' ; 21 } 22 bigint( int num) 23 { 24 memset(a, 0 , sizeof a); 25 len= 0 ; 26 if (num== 0 )len++ ; 27 else while (num)a[++len]=num% 10 ,num/= 10 ; 28 } 29 string tostring(

模板库

扶醉桌前 提交于 2020-09-30 15:36:26
呼,终于在考试之前复习了一遍所有模板。 球NOIP不跪! BigNumber 1 #include <iostream> 2 #include <cstdio> 3 #include < string > 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 const int maxlen= 3100 ; 8 struct bigint 9 { 10 int a[maxlen],len; 11 bigint() 12 { 13 memset(a, 0 , sizeof a); 14 len= 1 ; 15 } 16 bigint( string str) 17 { 18 memset(a, 0 , sizeof a); 19 len= str.length(); 20 for ( int i= 1 ;i<=len;i++)a[i]=str[len-i]- ' 0 ' ; 21 } 22 bigint( int num) 23 { 24 memset(a, 0 , sizeof a); 25 len= 0 ; 26 if (num== 0 )len++ ; 27 else while (num)a[++len]=num% 10 ,num/= 10 ; 28 } 29 string tostring(

C++移动构造函数以及move语句简单介绍

£可爱£侵袭症+ 提交于 2020-09-28 18:47:41
首先看一个小例子: #include <iostream> #include <cstring> #include <cstdlib> #include <vector> using namespace std; int main() { string st = " I love xing " ; vector < string > vc ; vc.push_back(move(st)); cout <<vc[ 0 ]<< endl; if (! st.empty()) cout <<st<< endl; return 0 ; } 结果为: #include <iostream> #include <cstring> #include <cstdlib> #include <vector> using namespace std; int main() { string st = " I love xing " ; vector < string > vc ; vc.push_back(st); cout <<vc[ 0 ]<< endl; if (! st.empty()) cout <<st<< endl; return 0 ; } 结果为: 这两个小程序唯一的不同是调用vc.push_back()将字符串插入到容器中去时, 第一段代码使用了move语句

Manacher(马拉车)————O(n)回文子串

三世轮回 提交于 2020-08-20 09:12:51
Manacher 一、背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在 O(n)的复杂度 中返回字符串s中 最长回文子串长度 的算法,十分巧妙。 让我们举个栗子,栗子: 1.字符串:abbababa 最长回文子串:5(abb ababa ) 2.字符串:abcbbabbc 最长回文子串:7(ab cbbabbc ) 3.字符串:abccbaba 最长回文子串:6( abccba ba) 传统方法是,遍历每个字符,以该字符为中心向两边查找。时间复杂度为 O(n^2) ,效率很差; 而这个神奇的Manacher算法将复杂度提升到了 O(n)。 来一起瞅一瞅它是如何工作的吧。 二、算法过程分析 回文分为奇回文(ababa)和偶回文(abba),这里比较难以处理,我们使用一个 小 (sao) 技 (cao) 巧 (zuo) ( 很重要 )。我们将字符串首尾和每个字符间插入一个字符( 注意 :这个自符在串中并未出现)例如:'#'. 栗子!栗子! s='abbadcacda'先转化成s_new='$#a#b#b#a#d#c#a#c#d#a#\0'('$'与'\0',是边界,下面的代码中可以看到) 这样原串中的偶回文(abba)与奇回文(adcacda),变成了(#a#d#d#a#)与(#a#d#c#a#c#d#a#)两个 奇回文 。 定义数组p[

Manacher(马拉车)————O(n)回文子串

那年仲夏 提交于 2020-08-20 09:11:57
Manacher 一、背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在 O(n)的复杂度 中返回字符串s中 最长回文子串长度 的算法,十分巧妙。 让我们举个栗子,栗子: 1.字符串:abbababa 最长回文子串:5(abb ababa ) 2.字符串:abcbbabbc 最长回文子串:7(ab cbbabbc ) 3.字符串:abccbaba 最长回文子串:6( abccba ba) 传统方法是,遍历每个字符,以该字符为中心向两边查找。时间复杂度为 O(n^2) ,效率很差; 而这个神奇的Manacher算法将复杂度提升到了 O(n)。 来一起瞅一瞅它是如何工作的吧。 二、算法过程分析 回文分为奇回文(ababa)和偶回文(abba),这里比较难以处理,我们使用一个 小 (sao) 技 (cao) 巧 (zuo) ( 很重要 )。我们将字符串首尾和每个字符间插入一个字符( 注意 :这个自符在串中并未出现)例如:'#'. 栗子!栗子! s='abbadcacda'先转化成s_new='$#a#b#b#a#d#c#a#c#d#a#\0'('$'与'\0',是边界,下面的代码中可以看到) 这样原串中的偶回文(abba)与奇回文(adcacda),变成了(#a#d#d#a#)与(#a#d#c#a#c#d#a#)两个 奇回文 。 定义数组p[

虚树套餐(随缘更新)

旧城冷巷雨未停 提交于 2020-08-19 19:06:52
由于本人太菜,所以字符串专题只学会了虚树一个知识点,所以写文乱giao 首先假装大佬地讲一下虚树: 虚树主要用于优化树DP,由于有些题hin贱,会有多次查询修改,还只查询一些关键点,此时直接树DP就跑不过去了。 这时我们想到,能不能减少点的个数,使树DP能跑得飞快呢? 学的时候联想到了这题,说不定也能用虚树做 我们通过把一条链压缩成一条边来简化这棵树 比如这棵树,黑色点是关键点,简化后就变成了 这时我们懒得遍历2 3 6 4这些节点了,反正也没用(-_-) 但是7号节点还是有必要留,毕竟还要递归嘛~~ 但怎么找到所有要保留的点并连边呢 维护右链 我们开一个栈,记录当前“最靠右的链” 先连接1号节点和最靠左的关键节点 8号节点 (红色是关键点,蓝色是右链,节点3 7都被压成了一条边) (是的,右链一开始是在左边的) 然后我们要让右链不断“往右移” 我们于是把更加“靠右”(是的,就是 物 理 靠 右 )的9号点添加进来,但是我们不能“把一个点加到一条边上”啊 我萌就把右链底端的8号点和新加入的9号点的lca:7号点还原,从而加入9 重复以上操作就可以构建出虚树 什么,你问怎么找到“物理靠右”?肯定是dfs序啦. void build_vtree(ll x){ if (tt== 1 ){ st[ ++tt]= x; return ; } ll lca = L_C_A(st[tt],x);

【CCF】无线网络 搜索

ぃ、小莉子 提交于 2020-08-19 16:22:05
【思路】 多个起点同时四周扩展广搜,注意会爆int 【AC】 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include< string > 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<map> 9 #include<stack> 10 using namespace std; 11 typedef long long ll; 12 const int maxn=1e3+ 2 ; 13 int n,m,k,d; 14 int mp[maxn][maxn]; 15 bool vis[maxn][maxn]; 16 int dis[maxn][maxn]; 17 struct node{ 18 int x; 19 int y; 20 int step; 21 node( int _x, int _y, int _s):x(_x),y(_y),step(_s){} 22 }; 23 int cnt; 24 int dir[ 4 ][ 2 ]={{ 1 , 0 },{- 1 , 0 },{ 0 , 1 },{ 0 ,- 1 }}; 25 queue<node> Q; 26 void init(){ 27 while

2020牛客暑期多校训练营(第六场)J Josephus Transform (置换)

我怕爱的太早我们不能终老 提交于 2020-08-18 12:59:37
https://ac.nowcoder.com/acm/contest/5671/J 题意: 初始有一个1-n的排列,对这个排列进行m次操作,每次操作对排列进行x次k-约瑟夫置换,问m次操作后的序列是什么。 k-约瑟夫置换:n个数围成一个圈,从第1个开始,数到第k个,将这个数字去掉,操作n次直至圈为空。数字去掉的顺序就是对该排列进行1次k-约瑟夫置换后的序列。 一个置换可以定义为一个函数的复合 记f={a1,a2,a3,……an }表示数1-n的一个置换,即 i-->ai,ai<=n 对于某一个操作来说,它的x次k-约瑟夫置换对每一个数进行的置换都是相同的。 比如:7个数进行5次4约瑟夫置换 1 2 3 4 5 6 7 一 4 1 6 5 7 3 2 二 5 4 3 7 2 6 1 三 7 5 6 2 1 3 4 四 2 7 3 1 4 6 5 五 1 2 6 4 5 3 7 其f={4,1,6,5,7,3,2} 置换(函数复合)乘法满足乘法结合律 所以只需要得到第一次的置换结果,对于x次同样的置换,用快速幂的方式完成即可 有关置换群,可以去看这篇博文: https://blog.csdn.net/hzk_cpp/article/details/99239041?utm_medium=distribute.pc_relevant.none-task-blog

【纪中oj 】C组 最大公约数

青春壹個敷衍的年華 提交于 2020-08-18 11:43:41
题目描述 给出两个正整数A,B,求它们的最大公约数。 输入 第一行一个正整数A。 第二行一个正整数B。 输出 在第一行输出一个整数,表示A,B的最大公约数。 样例输入 18 24 样例输出 6 数据范围限制 在40%的数据中,1 ≤ A,B ≤ 10^6 在60%的数据中,1 ≤ A,B ≤ 10^18 在80%的数据中,1 ≤ A,B ≤ 10^100 在100%的数据中,1 ≤ A,B ≤ 10^1000 这一题我一开始想到用 辗转相除法+高精 ,结果超时 这题用辗转太慢了,所以涉及到一个伟大的算法—— 迭代 如果两个数为偶数 结果乘2,两个数分别除以2 如果一偶一奇,偶数除以2,奇数不变 如果两个奇数,大的减去小的,保留小的 如果用辗转,要用高精除以高精,这样肯定超时 如果用迭代,只需打高精除低精就好了 (原谅我变量名过于庸俗) string gcd( string a, string b){ // 迭代 string p; if (a.size()<b.size()||(a.size()==b.size()&&a< b)) swap(a,b); if (a==b) return a; else if (even_numbers(a)== false &&even_numbers(b)== false ) p= gcd(jian(a,b),b); else if (even