c++
結城
人道洛阳花似锦,偏我来时不遇春
展开
-
根据数据范围推测使用算法
一般ACM或者笔试题的时间限制是1秒或2秒。在这种情况下,C++代码中的操作次数控制在 107∼108107∼108 为最佳。下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:n≤30, 指数级别, dfs+剪枝,状态压缩dpn≤100 => O(n3)O(n3),floyd,dp,高斯消元n≤1000 => O(n2)O(n2),O(n2logn)O(n2logn),dp,二分,朴素版Dijkstra、朴素版Prim、Bellman-Fordn≤10000 =>转载 2021-06-01 14:55:33 · 380 阅读 · 0 评论 -
dijkstra算法模版,基本思路
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。输入格式第一行包含整数 n 和 m。接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。输出格式输出一个整数,表示 1 号点到 n 号点的最短距离。如果路径不存在,则输出 −1。数据范围1≤n≤500,1≤m≤105,图中涉及边长均不超过10000。输入样例:3 3原创 2021-04-27 14:53:29 · 311 阅读 · 0 评论 -
常用代码模板3——搜索与图论
树与图的存储树是一种特殊的图,与图的存储方式相同。对于无向图中的边ab,存储两条有向边a->b, b->a。因此我们可以只考虑有向图的存储。(1) 邻接矩阵:g[a][b] 存储边a->b(2) 邻接表:// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点int h[N], e[N], ne[N], idx;// 添加一条边a->bvoid add(int a, int b){ e[idx] = b, ne[idx]转载 2021-04-09 09:00:29 · 119 阅读 · 0 评论 -
用字符串哈希方法解决字符串匹配问题
题目和题解如下。给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。输入格式第一行输入整数 N,表示字符串 P 的长度。第二行输入字符串 P。第三行输入整数 M,表示字符串 S 的长度。第四行输入字符串 S。输出格式共一行,输出所有出现位置的起始下标(下标从 0 开始计数),整数之间用空格隔开。数据范围1≤N≤1051≤M≤106输入样例:原创 2021-03-30 16:10:07 · 281 阅读 · 0 评论 -
AcWing 831. KMP字符串,如何理解和掌握 KMP 算法?
先指一个路:如何理解KMP,这真的很详细的解释了关于KMP算法的实现机理,看完就明白怎么实现了。其实关键在于如何进行搜索和维护next数组,具体解释见程序与注释题目与题解———————————————————————————————给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。输入格式第一行输入整数 N,表示字符串 P 的长度。第二行输入字符串转载 2021-03-27 14:28:38 · 130 阅读 · 0 评论 -
AcWing 154. 滑动窗口
单调队列入门题,核心在于队列是有单调性的给定一个大小为 n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。输入格式输入包含两行。第一行包含两个整数 n 和 k,分别代表数组长度和滑动窗口的长度。第二行有 n 个整数,代表数组的具体数值。同行数据之间用空格转载 2021-03-26 19:43:11 · 138 阅读 · 0 评论 -
AcWing 830. 单调栈
单调栈一般只会应用在这样的题里面,核心思想在于维护一个单调递增的序列,当新插入的数字比当前栈顶开始往下的数字大的时候,对应的栈内数字是绝对不会被输出的给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。输入格式第一行包含整数 N,表示数列长度。第二行包含 N 个整数,表示整数数列。输出格式共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。数据范围1≤N≤1051≤数列中元素≤109输入样例:5原创 2021-03-26 18:34:57 · 61 阅读 · 0 评论 -
scanf读入出错,记一次血泪教训(哭
事情是这样的,有一天阿p在做一道很简单的题,但是出现了很奇怪的错误,百思不得其解的阿p经过漫长的debug之后发现使用scanf读进来的数据居然是错误的,而且错得离谱,随即转用cincoutac了题目。但是,本着求知的态度,阿p又花了好久,终于发现,他所用的scanf一直是不规范的(哭),原来在输入数据格式中,回车是要显式的在scanf里写出来的。正如下题输入格式,回车不打进去,正常输入字符是被认成了回车的????(找了半个来小时的错误,气死阿p了,看看小姐姐消消气????)————————————原创 2021-03-25 20:00:23 · 513 阅读 · 0 评论 -
常用代码模板2——数据结构
单链表 —— 模板题 AcWing 826. 单链表// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化void init(){ head = -1; idx = 0;}// 在链表头插入一个数avoid insert(int a){ e[idx] = a, ne[idx] = head, head = idx ++ ;}// 将头结点删转载 2021-03-25 18:50:53 · 87 阅读 · 0 评论 -
常用代码模板1——基础算法——排序 二分 高精度 前缀和与差分 双指针算法 位运算 离散化 区间合并
排序二分高精度前缀和与差分双指针算法位运算离散化区间合并快速排序算法模板 —— 模板题 AcWing 785. 快速排序void quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] <.转载 2021-03-18 16:40:05 · 129 阅读 · 0 评论 -
AcWing 66. 两个链表的第一个公共结点
题源输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。样例思路:两个指针分别从一端开始走,走到最后就去对方的链表再开始走重头来,这样二者相遇时候就恰好是走了相同的距离/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * };原创 2021-03-15 15:00:56 · 77 阅读 · 0 评论 -
AcWing 87. 把字符串转换成整数
题源请你写一个函数 StrToInt,实现把字符串转换成整数这个功能。当然,不能使用 atoi 或者其他类似的库函数。样例输入:“123”输出:123注意:你的函数应满足下列条件:忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;整数后可能有任意非数字字符,请将其忽略;如果整数长度为 0,则返回 0;如果整数大于 INT_MAX(231−1),请返回 INT_MAX;如果整数小于INT_MIN(−23原创 2021-03-15 09:47:25 · 190 阅读 · 0 评论 -
AcWing 36. 合并两个排序的链表
题源输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。样例输入:1->3->5 , 2->4->5输出:1->2->3->4->5->5思想是创建一个新的头尾节点然后一点点移动插入/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode原创 2021-03-15 09:13:52 · 68 阅读 · 0 评论 -
AcWing 823. 排列
题源给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1...原创 2021-03-13 19:32:28 · 101 阅读 · 0 评论 -
跳台阶
题源一个楼梯共有n级台阶,每次可以走一级或者两级,问从第0级台阶走到第n级台阶一共有多少种方案。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示方案数。数据范围1≤n≤15输入样例:5输出样例:8百度了一下发现就是斐波那契数列,惭愧惭愧#include <iostream>using namespace std;bool gone = false;int stair(int n){ if(n == 0) return 1;原创 2021-03-13 15:57:45 · 112 阅读 · 0 评论 -
字符串最大跨距
题源有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。现在,我们想要检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。例如,S = “abcd123ab888efghij45ef67kl”, S1=”ab”, S2=”ef”,其中,S1在S中出现了2原创 2021-03-12 16:09:32 · 290 阅读 · 0 评论 -
字符串乘方
题源给定两个字符串a和b,我们定义a*b为他们的连接。例如,如果a=”abc” 而b=”def”, 则a*b=”abcdef”。如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=””(空字符串),a(n+1)=a∗(an)。输入格式输入包含多组测试样例,每组测试样例占一行。每组样例包含一个字符串s,s的长度不超过100。最后的测试样例后面将是一个点号作为一行。输出格式对于每一个s,你需要输出最大的n,使得存在一个字符串a,让s=an。输入样例:abcdaaa原创 2021-03-12 15:29:47 · 344 阅读 · 1 评论 -
语法基础学习记录
假设想初始化一个数组全0,就这样,没写的后面默认全0int x[100] = {0};原创 2021-03-09 17:40:57 · 61 阅读 · 0 评论 -
leetcode 53. 最大子序和 - 力扣(Leetcode)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-subarray著作权归领扣网络所有。商业转载请联系官方授权,非商原创 2020-10-08 10:05:59 · 157 阅读 · 0 评论 -
指定起点并经过给定部分路线,遍历全部节点后回到起点的深度优先搜索
奔跑的邮件:邮政车每天都要把各个邮筒里的邮件都拉走,但它只经过每一个邮筒一次,最后返回起点。要求:(1)画出邮筒的分布图,比如以矩阵表示,6*6的大小;(2)规定起点,并给出部分路线,不超过五条;(3)根据上述条件,画出完整路线图。说明:可以上下左右移动,但不能对角线行走。#include<iostream>#include<cmath>#include<cstring>#include<string>#include<algorith原创 2020-09-21 20:54:51 · 1562 阅读 · 0 评论