【编程训练-考研上机模拟】综合模拟2-2019浙大上机模拟(晴神)

A - next[i]

Problem Description

在字符串匹配的KMP算法中有一个重要的概念是next数组,求解它的过程让不少同学伤透了心。next数组的直接语义其实是:使“长度为L的前缀”与“长度为L的后缀”相同的最大L,且满足条件的前后缀不能是原字符串本身。

例如对字符串"ababa"来说,长度为1的前缀与后缀都是"a",它们相同;长度为2的前缀与后缀分别是"ab"和"ba",它们不相同;长度为3的前缀与后缀都是"aba",它们相同;长度为4的前缀与后缀分别是"abab"和"baba",它们不相同。因此对字符串"ababa"来说,使“长度为L的前缀”与“长度为L的后缀”相同的最大L是3。

现在我们把这个最大的L值称为原字符串S的next值。在此概念的基础上,对给定的字符串S,下标为从1到N,那么next[i]就是指子串S[1...i]的next值。

现在给定一个字符串,下标从1到N,然后给一个下标i,求next[i]。

Input

每个输入文件一组数据。

只有一行,输入一个仅由小写字母组成的长度为N(1<=N<=100)的字符串、与一个下标i(1<=i<=N)。

Output

一个整数,即next[i]。

Sample Input 1

ababa 5

Sample Output 1

3

Sample Input 2

ababab 4

Sample Output 2

2

Sample Input 3

ab 2

Sample Output 3

0

分析:掌握具体算法即可,算法详解见KMP算法

#include<bits/stdc++.h>
using namespace std;
void buildNext(string str, int nt[]){int len = str.size();nt[0] = -1;int t = nt[0], j = 0;while(j < len - 1){if(t < 0 || str[j] == str[t]){nt[++j] = ++t;}else{t = nt[t];}}
}
int main(){int nt[110];string str;cin>>str;buildNext(str, nt);int index;cin>>index;cout<<nt[index - 1] + 1<<endl;return 0;
}

B - 链表重排

Problem Description

给定一条单链表,将链表结点进行头尾交错重新排序,即如果一条单链表为 L1 -> L2 -> ... -> L(n-1) -> Ln ,那么重新排序完的结果是 L1 -> Ln -> L2 -> L(n-1) -> L3 -> L(n-2) -> ...

Input

每个输入文件中一组数据。

第一行给出结点的总个数N(0<N<10^5)和单链表的第一个结点的地址。所有结点的地址要么是一个五位正整数,要么是用-1表示的空地址NULL。然后是N行,表示N个结点,每行的格式为

Address Data Next

其中Address为结点地址(不足5位的高位用零填充至5位),Data为结点的数据域(绝对值不超过10^5的整数),Next为结点的指针域(即下一个结点的地址)。数据保证Address不等于-1。

Output

输出按题目要求重新排序后的单链表。第一行为重新排序后单链表上结点的个数、第一个结点的地址。

之后每行一个结点,输出格式与输入相同,结点输出顺序为单链表连接顺序。

Sample Input

5 11111
33333 0 44444
22222 2 33333
11111 5 22222
05689 8 -1
44444 6 05689

Sample Output

5 11111
11111 5 05689
05689 8 22222
22222 2 44444
44444 6 33333
33333 0 -1

分析:

1. 链表的长度要自己计算,不是所有的节点都会用到

2. 链表可能是空的

#include<bits/stdc++.h>
using namespace std;
const int nmax = 100010;
int data[nmax], nt[nmax], lt[nmax];
int main(){int n, head;cin>>n>>head;for(int i = 0; i < n; i++){int addr;cin>>addr;cin>>data[addr]>>nt[addr];}int len = 0;while(head != -1){lt[len++] = head;head = nt[head];}vector<int>ans;int i = 0, j = len - 1;while(i <= j){ans.push_back(lt[i++]);if(i < j)ans.push_back(lt[j--]);}if(ans.size() == 0){printf("0 -1");return 0;}printf("%d %05d\n", ans.size(), ans[0]);for(int i = 0; i < ans.size() - 1; ++i){printf("%05d %d %05d\n", ans[i], data[ans[i]], ans[i + 1]);}printf("%05d %d -1\n", ans.back(), data[ans.back()]);return 0;
}

C - 极大匹配

Problem Description

对给定的无向图G=(V,E),如果边集E'满足:(1)E'是E的子集;(2)E'中的任意两条边都没有公共顶点,那么称边集E'为图G的一个匹配(Matching)。而如果往E'中增加任意一条在E中但不在E'中的边,都会导致E'不再是图G的匹配,那么称E'为图G的一个极大匹配(Maximal Matching)。
(以上定义引自https://en.wikipedia.org/wiki/Matching_(graph_theory))

根据上面的定义,请判断一些给定的边集是否是给定的无向图的极大匹配。

Input

每个输入文件一组数据。

第一行两个整数N、M(1<=N<=1000, 0<=M<=N*(N-1)/2),表示顶点数和边数,假设所有顶点的编号为1到N。

接下来M行,每行两个正整数u、v(1<=u,v<=N, u!=v),表示一条边的两个端点编号。

然后一个正整数K(K<=10),表示查询个数。

接下来为K个查询,每个查询第一行为一个正整数L,表示待查询边集的边数,接下来L行每行两个正整数,表示一条边的两个端点编号。数据保证每个查询中相同的边只会出现一次,且所有边都在图中存在。

Output

每个查询输出一行,如果给定的边集是极大匹配,那么输出Yes;如果它是匹配但不是极大匹配,那么输出Not Maximal;如果不是匹配,那么输出Not a Matching

Sample Input

4 4
1 2
1 3
2 3
2 4
4
1
2 3
1
1 3
2
1 2
2 4
2
1 3
2 4

Sample Output

Yes
Not Maximal
Not a Matching
Yes

Solution

#include<bits/stdc++.h>
using namespace std;
const int nmax = 1010;
bool vis[nmax], G[nmax][nmax], tempG[nmax][nmax];
struct node{int u, v;
};
int main(){int n, m, K, L;vector<node>E;cin>>n>>m;fill(G[0], G[0] + nmax * nmax, false);for(int i = 0; i < m; ++i){int u, v;cin>>u>>v;G[u][v] = G[v][u]  =true;E.push_back({u, v});}cin>>K;for(int i  =0; i < K; ++i){vector<node>tempE;fill(vis, vis + nmax, false);fill(tempG[0], tempG[0] + nmax * nmax, false);cin>>L;bool flag = true;for(int j = 0; j < L; ++j){int u, v;cin>>u>>v;if(G[u][v] == false)flag = false;if(vis[u] == true || vis[v] == true)flag = false;tempG[u][v] = tempG[v][u] = true;tempE.push_back({u, v});vis[u] = vis[v] = true;}if(flag == false)printf("Not a Matching\n");else{for(int j = 0; j < E.size(); ++j){int u = E[j].u, v = E[j].v;if(tempG[u][v] == false){if(vis[u] == false && vis[v] == false){flag = false;break;}}}if(flag == true)printf("Yes\n");else printf("Not Maximal\n");}}return 0;
}

D - 关键路径

Problem Description

给定一个有N个顶点、M条边的有向图,顶点下标为从1到N,每条边都有边权。判断这个有向图是否是有向无环图,如果是的话,请处理K个查询,每个查询为图中的一条边,求这条边的最早发生时间和最晚发生时间。最后再输出图中的所有关键路径。

Input

每个输入文件中一组数据。

第一行为两个整数N、M,表示有向无环图的顶点数和边数(1<=N<=1000, 0<=M<=N*(N-1)),顶点编号为从1到N。

接下来M行,每行为三个正整数u、v、w(1<=u,v<=N,0<w<=20,u!=v),分别表示有向边的起点、终点、边权。数据保证不会有两条起点和终点都相同的边。

然后是一个正整数K(1<=K<=1000),表示查询个数。

接着是K行,每行为两个正整数u、v,分别表示查询边的起点和终点。数据保证查询边一定是图上存在的边。

Output

如果给出的图不是有向无环图,那么在一行里输出NO,后面的查询结果和关键路径均不需要输出;

如果给出的图是有向无环图,那么在一行里输出YES,接着输出下面的内容:

每个查询一行,输出查询边的最早发生时间和最晚发生时间;

之后一行输出一个整数:关键路径上的边权之和;

最后若干行输出所有关键路径,每行表示其中一条,格式为用->连接的顶点编号。注意,如果有两条关键路径a[1]->a[2]->...->a[k]->a[k+1]->...与b[1]->b[2]->...->b[k]->[k+1]->...,满足a[1]==b[1]、a[2]==b[2]、...、a[k]==b[k]、a[k+1]<b[k+1],那么把关键路径a优先输出。数据保证关键路径条数不超过10000条。

Sample Input 1

4 5
1 2 3
1 3 2
1 4 5
2 4 1
3 4 3
2
1 3
2 4

Sample Output 1

YES
0 0
3 4
5
1->3->4
1->4

Sample Input 2

3 3
1 2 3
2 3 1
3 2 2
2
1 2
2 3

Sample Output 2

NO

分析:

1.多个有向图

2.多起点、多汇点

3.图中存在孤立点,此时入度也为0

求关键路径时,将存关键路径上的边而非关键活动,使用邻接表而非邻接矩阵

#include<bits/stdc++.h>
using namespace std;
const int nmax = 1010;
struct node{int v, w;
};
vector<node>G[nmax];
vector<int>activity[nmax];
int n, m, inDeg[nmax] = {0}, inDegOrigin[nmax] = {0};
int ve[nmax], vl[nmax];
int e[nmax][nmax], l[nmax][nmax];
stack<int>topOrder;
bool topologicalSort(){queue<int>q;for(int i = 1; i <= n; ++i){if(inDeg[i] == 0)q.push(i);}while(!q.empty()){int u = q.front();q.pop();topOrder.push(u);for(int i = 0; i < G[u].size(); ++i){int v = G[u][i].v;inDeg[v]--;if(inDeg[v] == 0)q.push(v);ve[v] = max(ve[v], ve[u] + G[u][i].w);}}if(topOrder.size() == n)return true;else return false;
}
int criticalPath(){fill(ve, ve + nmax, 0);if(topologicalSort() == false)return -1;int maxLen = -1;for(int i = 1; i <= n; ++i){if(ve[i] > maxLen)maxLen = ve[i];}fill(vl, vl + nmax, maxLen);while(!topOrder.empty()){int u = topOrder.top();topOrder.pop();for(int i = 0; i < G[u].size(); ++i){int v = G[u][i].v;vl[u] = min(vl[u], vl[v] - G[u][i].w);}}for(int u = 1; u <= n; ++u){for(int i = 0; i < G[u].size(); ++i){int v = G[u][i].v, w = G[u][i].w;e[u][v] = ve[u];l[u][v] = vl[v] - w;if(e[u][v] == l[u][v])activity[u].push_back(v);}}return maxLen;
}
vector<int>path;
void dfs(int u){if(activity[u].size() == 0){path.push_back(u);int flag = 0;for(int x : path){if(flag == 1)printf("->");printf("%d", x);flag = 1;}printf("\n");path.pop_back();return;}path.push_back(u);sort(activity[u].begin(), activity[u].end());for(int x : activity[u]){dfs(x);}path.pop_back();
}
int main(){scanf("%d%d", &n, &m);for(int i = 0; i < m; ++i){int u, v, w;scanf("%d%d%d", &u, &v, &w);G[u].push_back({v, w});inDeg[v]++;inDegOrigin[v]++;}int maxLen = criticalPath();if(maxLen == -1)printf("NO\n");else{printf("YES\n");int k;scanf("%d", &k);for(int i = 0; i < k; ++i){int u, v;scanf("%d%d", &u, &v);printf("%d %d\n", e[u][v], l[u][v]);}printf("%d\n", maxLen);for(int i =1; i <= n; ++i){if(inDegOrigin[i] == 0 && activity[i].size() != 0)dfs(i);}}return 0;
}

转载于:https://www.cnblogs.com/vinnson/p/10844947.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS常用工具

wall haven 墙纸 CSS tricks shape 用CSS作图 iconfont.cn 小图标工具网站&#xff0c;&#xff08;添加至项目→symbol→查链接→生成代码→<script>→使用帮助&#xff09; CSS3 linear gradient &#xff08;generator&#xff09; 线性渐变工具 CSS animation…

CSS li 一半左浮一半右浮

.skills >ol li{float: left; 左浮width: 48%;margin-bottom: 40px; } .skills >ol li:nth-child(even){ //even 偶数 odd 奇数float: right; 右浮 }另一种 .skills >ol li:nth-child(1){ //第一个margin-left: 0; }.skills >ol li:first-child{ //…

addEventListener事件委托

什么是事件委托&#xff1a;通俗的讲&#xff0c;事件就是onclick&#xff0c;onmouseover&#xff0c;onmouseout&#xff0c;等就是事件&#xff0c;委托呢&#xff0c;就是让别人来做&#xff0c;这个事件本来是加在某些元素上的&#xff0c;然而你却加到别人身上来做&#…

HTML常遇问题

1、span 里面套 div 会有问题&#xff0c;可以套 span&#xff0c;再加语句 display:block; 相当于套了div 2. 外部不能加padding&#xff0c;所以可以再里层加 div&#xff0c;在加padding可以了 3、display:block; display:inline-block; 让border将它们包住 4、*{ …

bzoj3771:Triple

传送门 生成函数 设生成函数\(f(x)\)&#xff0c;可以将系数定为选的方案数&#xff0c;指数定为代价 那么\[ f(x)\sum_{i1}^{n}x^{w_i} \] 然后答案就是\(f^3(x)f^2(x)f(x)\)然后去掉重复的情况 然后我们设\[ A(x)\sum_{i1}^{n}x^{2w_i}\\ B(x)\sum_{i1}^{n}x^{3w_i} \] 重复的…

CSS图片设置

1、background-position: center center; 图片居中 background-size: cover; 让图片自适应&#xff0c;按比例缩放 2、加背景色mask&#xff0c;面罩&#xff1a; background: rgba(0, 0, 0, 0.7); 宽度不要写&#xff0c;自适应的 3. 图片的宽度&#xff0c;最好先规定好&…

sqlserver——视图

数据库中的视图是一个虚拟表。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据&#xff0c;行和列数据用来自由定义视图和查询所引用的表&#xff0c;并且在引用视图时动态产生。本篇将通过一些实例来介绍视图的概念&#xff0c;视图的作用&#xff0c;创建视图…

js常用API

(1) getAttribute 用户写啥是啥&#xff0c;#后面的值&#xff0c;获取用户在上面写的原文&#xff0c;不是浏览器加http协议的东西&#xff1b; <a href"#siteAbout">关于</a> var href a.getAttribute(href) // hrefsiteAbou…

DOM相关(主要是var和let的区别用法)

一、1.节点的类型有七种&#xff0c;分别是&#xff1a;Document&#xff0c;DocumentType&#xff0c;Element&#xff0c;Attribute&#xff0c;Text&#xff0c;Comment&#xff0c;DocumentFragment 2.DOM树的根节点是&#xff1a;html 3.元素Element的NodeType值为&…

JOIN三个表格

表格一 表格二 表格三 SQL语句为 SELECT * FROM movie JOIN casting ON movie.idcasting.movieid     JOIN actor ON casting.actoridactor.id(要注意join 的格式) 最终结果展示在最下面 idtitleyrdirectorbudgetgrossmovieidactoridordidname1001710 Rillington Place19…

深度学习入门|第5章 误差反向传播法(二)

误差反向传播法 前言 此为本人学习《深度学习入门》的学习笔记 四、简单层的实现 本节将用 Python 实现前面的购买苹果的例子。这里&#xff0c;我们把要实现的计算图的乘法节点称为“乘法层”&#xff08;MulLayer&#xff09;&#xff0c;加法节点称为“加法层”&#xff08;…

内容样式行为分离

CSS负责HTML&#xff1a;人类选不中&#xff1b;js取不到 CSS负责JS: 如果逻辑复杂&#xff0c;CSS会变慢&#xff0c;页面会变慢

CSS图片布局 flex(竖着的几张图片改为一排)

<style>.images{display: flex;align-items: flex-start;//border: 1px solid red; 有可能边框包不住这几张图片&#xff0c;但如果窗口够大&#xff0c;也可以包住//overflow: hidden; 如果写了&#xff0c;超出边框的部分会被隐藏 } </style> 布局有两种方式&a…

牡丹-曹州牡丹:曹州牡丹

ylbtech-牡丹-曹州牡丹&#xff1a;曹州牡丹菏泽牡丹&#xff0c;山东省菏泽市特产&#xff0c;中国国家地理标志产品。牡丹&#xff0c;原产中国西北部&#xff0c;秦岭和陕北山地多野生&#xff0c;栽培历史悠久&#xff0c;南北朝时已声成为观赏植物。菏泽&#xff0c;古称曹…

idea报错:Error: java: 错误: 不支持发行版本 5

我在测试类运行时&#xff0c;出现下述错误&#xff1a; 可能原因&#xff1a;java版本不一致项目编译配置使用的java版本不对 解决方案&#xff1a; 第一步&#xff1a;file---Project Structure-- Project&#xff08;两版本改为一致&#xff1a;第二、三个横框中数字都为11…

python网络爬虫基础day01

2019.5.13&#xff0c;今天在“小猿圈”跟着波波老师学习了爬虫开发的第一章和第二章&#xff0c;总结下今天学的知识&#xff1a; 爬虫基础介绍&#xff1a;   什么是爬虫&#xff1f;    - 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数…

忘记mysql数据库连接密码

本次操作所有需要用到的密令行&#xff1a; bin>net stop mysql bin>mysqld --skip-grant-tables bin>mysql mysql>use mysql mysql>update user set passwordpassword("123456") where user"root"; mysql>flush privileges; mys…

Python 基础 函数

1&#xff1a;调用函数 eg&#xff1a;调用内置函数 abs() 求绝对值 2&#xff1a;定义函数 1&#xff1a;定义一个函数要使用 def 语句&#xff0c;依次写出函数名、括号、括号中的参数和冒号:&#xff0c;然后&#xff0c;在缩进块中编写函数体&#xff0c;函数的返回值用ret…

Springmvc跨服务器文件上传报403,409错误

报403错误 Tomcat默认只读模式&#xff0c;传图片会被拒绝 解决&#xff1a;找到 Tomcat 目录---conf下---web.xml&#xff0c;打开 加入 <init-param><param-name>readonly</param-name><param-value>false</param-value> </init-param&g…

Vue中message.split().reverse().join()函数用法

1、split() 把一个字符串分割成字符串数组 把数据拆分为一个数组,括号里的 是把数据拆分为每个字符串 2、reverse() 颠倒数组中元素的顺序 只作用于数组&#xff0c;跟在split()后才能起作用&#xff0c;在一个字符串后面不起作用&#xff0c;如message.reverse() 3、join()…