memset

你必须知道的指针基础-6.内存的初始化及结构体的使用

孤者浪人 提交于 2020-03-08 20:58:55
一、内存的使用 1.1 你创建的内存区域可能是脏的   当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char chs[20]; // 这个代码打印出来的可能就是乱码,因为printf的%s是“打印一直遇到'\0'”。 printf("%s\n",chs); return 0; }   其运行结果是如下图所示的乱码,因为printf的%s是“ 打印一直遇到'\0' ”。 1.2 解决脏内存区域的办法   那么,如何解决上面我们有可能会访问的脏内存区域呢?在C语言中,可以采用如下的两种方法:   (1)使用memset函数首先清理一下内存: void *memset(void *s, int ch, unsigned n); 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。   那么,我们可以使用memset函数来清理内存,即填充创建的这块内存区域: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char

NENUACM 2020 复健训练 #4 题解

白昼怎懂夜的黑 提交于 2020-03-08 02:31:52
题目链接 Search for Pretty Integers 题意:给你两行数(均是个位数),第一行有n个数,第二行有m个数,让你构造一个最小的数满足至少包含一个第一行里的数且至少包含一个第二行里的数。 思路:显然,如果两行数里有相同的数,那么答案就是这些相同的数里的最小值;否则,以第一行里的数为十位数,以第二行里的数为个位数枚举,然后以第二行里的数为十位数,以第一行里的数为个位数枚举,取最小值即可。 #include<bits/stdc++.h> #define mem(a,b) memset((a),b,sizeof(a)) #define de cout<<endl<<endl<<endl typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=1e5+10; using namespace std; int a[15],b[15]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d",&b[i]); int ans=100; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if

数组初始化

余生长醉 提交于 2020-03-06 14:21:52
在c++中,一个变量或数组变量定义完成后,其值均为系统预设,不一定是我们想要的。一般情况下,全局变量或数组系统会自动初始化(整数一般为0,布尔型为false,字符型为\0),而局部变量则为随机。特别是数组变量,我们在使用中一定义可能就是很大数量的变量,系统预设的可能非我们想要的,那就存在数组变量的统一初始化了。如何初始化数组变量? 一、在数组定义时直接赋值   例1:int a[5]={1,2,3,4,5};这样数组的每一个值都确定了,a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5。 当然这种方法赋值很明确,但也很麻烦,特别是数组但很大时不太实用。   例2:在赋值时我们也可以采用省略形式。例1中写法也可以省略为int a[]={1,2,3,4,5}; 这种写法没指定元素个数,那系统将根据我们提供的值的个数来确定定义的元素个数。如上例中就定义了5个元素,并完成赋值。   例3:我们还可以采用部分赋值法。如int a[10]={1,2,3}; 我们定义了10个元素,但我们只给了三个值,这样得到的结果是a[0]=1,a[1]=2,a[3]=3,其余元素的值全为0。 当然,我们也可以有一个极限写法int a[10]={};一个值没指定,也可以理解为指定了0个元素的值,其余元素的值全为0,即是全部元素值为0。 其他类型数组省略部分数据的值请参照全局变量预设。 二

[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

烈酒焚心 提交于 2020-03-06 00:56:03
[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kruskal重构树。我们把边按海拔高度从大到小排序,然后建立一棵Kruskal重构树。 树上维护什么呢?我们除了在点上记录高度外,把最底层的点1~n的权值设为点i到1的最短路径长度,然后维护子树最小值。我们在Kruskal重构树上从v开始树上倍增,找到深度最浅的高度>=水位线的点x,这样x子树中的点都是开车可以到达的,而最小步行距离就是x子树中的点对应到原图上后,到点1的距离。 代码 //https://www.luogu.org/problem/P4768 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #define maxn 200000 #define maxm 400000 #define maxlogn 23 using namespace std; typedef long long ll; int t; int n,m,q,k,s; struct graph { struct edge { int from;

开篇词The Start以及[Vjudge][HDU2242]空调教室

给你一囗甜甜゛ 提交于 2020-03-05 10:48:01
这是我写的第一篇记录好题的博客,也是博客园上我发布的第一篇博客。 以后我的所有博客都将在洛谷和博客园上同时发布,同志们有兴趣的在哪里都可以看一看。 [https://www.luogu.com.cn/blog/DarthVictor/#](洛谷博客) [https://www.cnblogs.com/DarthVictor/](博客园) 那么今天要记录的就是: 空调教室! 题目如下: 题面 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们。Lele也是其中一个。而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY。 一个炎热的下午,Lele照例在教室睡觉的时候,竟然做起了空调教室的美梦。 Lele梦到学校某天终于大发慈悲给某个教室安上了一个空调。而且建造了了M条通气管道,让整个教学楼的全部教室都直接或间接和空调教室连通上,构成了教室群,于是,全部教室都能吹到空调了。 不仅仅这样,学校发现教室人数越来越多,单单一个空调已经不能满足大家的需求。于是,学校决定封闭掉一条通气管道,把全部教室分成两个连通的教室群,再在那个没有空调的教室群里添置一个空调。 当然,为了让效果更好,学校想让这两个教室群里的学生人数尽量平衡。于是学校找到了你,问你封闭哪条通气管道,使得两个教室群的人数尽量平衡,并且输出人数差值的绝对值。 Input 本题目包含多组数据,请处理到文件结束

hdu1814 Peaceful Commission

狂风中的少年 提交于 2020-03-05 06:18:24
hdu1814 Peaceful Commission 题意:2-sat裸题,打印字典序最小的 我写了三个 染色做法,正解 scc做法,不管字典序 scc做法,错误的字典序贪心 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 2e4+5, M = 1e5+5; inline int read() { int x = 0, f = 1; char c = getchar(); while(c<'0' || c>'9') {if(c=='-') f=-1; c=getchar();} while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();} return x * f; } int n, m; struct edge {int v, ne;} e[M]; int cnt, h[N]; inline void ins(int u, int v) { e[++cnt] = (edge) {v, h[u]}; h[u] = cnt; } inline int id(int x) {return ((x-1)^1)+1;} int col

memset movq giving segfault

女生的网名这么多〃 提交于 2020-03-04 05:03:13
问题 I've been stuck with the gdb for a few hours now. I am getting a segfault at the movq (%rsi, %rcx) line. I know you can't do mem->mem mov, so I did it through a temporary register. (%rsi), %rcx, then in the loop %rcx, (%rdi). Here is my code: experimentMemset: #memset(void *ptr, int value, size_t num) #%rdi #%rsi #%rdx movq %rdi, %rax #sets rax to the first pointer, to return later .loop: cmp $0, (%rdx) #see if num has reached 0 je .end cmpb $0, (%rdi) #see if string has ended also je .end

HDU 1561 The more, The Better【树形DP】

只谈情不闲聊 提交于 2020-03-03 22:20:55
Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? Input 每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。 Output 对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。 Sample Input 3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0 Sample Output 5 13 转:分析: 状态 dp[i][j] 为以 i 为根节点,选出 j 个节点的最大价值(包括 i 这个节点) 转移方程:dp[i][j]=max(dp[i1][j1]+dp[i2][j2]+....+dp[ik][jk])+a[i] j1+j2+...+jk=j

ACM模板(持续补完)

半腔热情 提交于 2020-03-02 15:15:36
KMP 1 #include<cstring> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=2000; 6 char a[maxn+50],s[maxn+50]; 7 int next[maxn+50][maxn+50]; 8 int len1,len,t; 9 int main() 10 { 11 scanf("%d\n",&t); 12 while(t--) 13 { 14 s[0]='0'; 15 scanf("%s",s+1); 16 len=strlen(s); 17 for(int k=1;k<len;++k) 18 { 19 int j=k-1; 20 next[k][k]=k-1; 21 for(int i=k+1;i<len;++i) 22 { 23 while(j>=k&&s[j+1]!=s[i]) j=next[k][j]; 24 if(s[j+1]==s[i]) ++j; 25 next[k][i]=j; 26 } 27 } 28 long long ans=0; 29 for(int k=1;k<len;++k) 30 { 31 int j=k-1; 32 for(int i=1;i<len;++i) 33 { 34 while(j>=k&