LGOJP3952 时间复杂度
题目链接
题解
细心模拟题。最主要就是要细心,并且注释不要嫌多&码风要好,心态要好。思路没捋清晰之前不要动手写代码。
对于\(ERR\),用栈来存放当前的数据。然后用个\(vis\)来判断字母重复。
输入用\(getline\)来输入会方便一点
然后对于并列,在栈空的时候进入新循环即可
对于嵌套,注意是否能展开。在嵌套层数的时候需要注意是否有展开(这个只能特判一下,类似栈,同时注意在\(E\)的时候把对应的删了)
最主要还是不能急啊,一开始心急打了一遍,结果死活调不出来:(。
#include <bits/stdc++.h>
using namespace std;
const int inf = 10000;
int T, n, tim, now;
string s[1000], O;
int st[20200][5], vis[26], top;
int idx(char c) {
return c - 'a';
}
int main() {
cin >> T;
while (T--) {
// Input
cin >> n;
cin >> O; getchar();
now = tim = 0;
if ((int)O.size() == 4) tim = 0;
else {
for (int i = 4; i < (int)O.size() - 1; ++i) tim = tim * 10 + O[i] - '0';
}
// 清数据
top = 0;
memset(vis, 0, sizeof(vis));
bool ERR_flag = 0;
int tot_not = 0, fzd = 0, mx = 0;
for (int pos = 1; pos <= n; pos++) {
getline(cin, s[pos]);
// 循环类型
if (s[pos][0] == 'F') { // F
// 处理循环
int num1 = 0, num2 = 0, cur = 0;
if (s[pos][4] == 'n') num1 = inf, cur = 5;
else {
cur = 4;
while (s[pos][cur] >= '0' && s[pos][cur] <= '9') {
num1 = num1 * 10 + s[pos][cur] - '0';
cur++;
}
}
++cur;
if(s[pos][cur] == 'n') num2 = inf;
else {
while (s[pos][cur] >= '0' && s[pos][cur] <= '9') {
num2 = num2 * 10 + s[pos][cur] - '0';
cur++;
}
}
// 判断该层复杂度
if (num1 == num2 || (num1 != inf && num2 != inf)) fzd *= 1;
if (num1 > num2) tot_not++;
if (num1 != num2 && num2 == inf && !tot_not) ++fzd;
mx = max(mx, fzd);
// 处理变量
if (vis[idx(s[pos][2])]) ERR_flag |= 1;
vis[idx(s[pos][2])] = 1;
st[++top][0] = idx(s[pos][2]);
st[top][1] = num1 != num2 && num2 == inf && !tot_not;
st[top][2] = num1 > num2;
// st[][1] 判断是否对复杂度有贡献
// st[][2] 判断以下嵌套的是不是展不开
}
else { // E
// 处理栈
vis[st[top][0]] = 0;
if(st[top][1]) --fzd;
if(st[top][2]) --tot_not;
--top;
}
}
if(ERR_flag || top) puts("ERR");
else if(mx != tim) puts("No");
else puts("Yes");
// Debug
// printf("ERR_flag : %d top : %d\n", ERR_flag, top);
// printf("Time: %d O: %d\n", tim, mx);
// printf("tot_not: %d\n", tot_not);
}
}
/*
细心模拟题。最主要就是要细心,并且注释不要嫌多&码风要好,心态要好。思路没捋清晰之前不要动手写代码。
对于ERR,用栈来存放当前的数据。然后用个vis来判断字母重复。
输入用getline来输入会方便一点
然后对于并列,在栈空的时候进入新循环即可
对于嵌套,注意是否能展开。在嵌套层数的时候需要注意是否有展开(这个只能特判一下,类似栈,同时注意在E的时候把对应的删了)
*/
LGOJP3952 时间复杂度的更多相关文章
- 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法
有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
- 实现一个 能在O(1)时间复杂度 完成 Push、Pop、Min操作的 栈
一,问题描述 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素.同时,栈的基本操作:入栈(Push).出栈(Pop),也是在O(1)时间内完成的. 二,问 ...
- 设计一个Stack,要求Push、Pop、获取最大最小值时间复杂度都为O(1)
面试的时候,面试官让设计一个栈,要求有Push.Pop和获取最大最小值的操作,并且所有的操作都能够在O(1)的时间复杂度完成. 当时真没啥思路,后来在网上查了一下,恍然大悟,只能恨自己见识短浅.思路不 ...
- Linux内核完全注释阅读笔记1:O(1)时间复杂度查找timeout定时器
前言 一直有Linux kernel情节,之前也一直在看Linux kernel相关的书和代码,但是每次到最后又由于兴趣转变而荒废了.这次终于静下心来想把Linux内核相关的代码好好看看,算是对自己的 ...
- 数据结构(C语言第2版)----时间复杂度和单链表
马上要到校招了,复习下相关的基础知识. 时间复杂度是什么? 官方解释: 算法的执行时间需要依据算法所编制的程序在计算机上于运行时所消耗的时间来度量.在算法中可以使用基本的语句的执行次数作为算法的时间复 ...
- 时间复杂度---我又要想起初中数学老师的脸了xxxxx
时间复杂度: 常用的时间复杂度有:常数级,对数级,线性级 线性对数级 平方级,立方级别,多项式级别,指数级别,阶乘级别 这里我们主要探讨对数级,线性级,平方级,指数级---为什么不讨论其他的?别的我也 ...
- 【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
转自:http://blog.csdn.net/vast_sea/article/details/8167968 看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSor ...
随机推荐
- appium 弹窗处理
测试过程中遇到两类弹窗: 系统权限弹窗具体业务弹窗系统权限弹窗Android系统权限弹窗一般出现在安装 app 后首次打开,如:定位权限.电话权限等.我们可以按顺序执行测试用例,将该类操作放到 Ini ...
- 第3/7Beta冲刺
1.团队成员 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.SCRU部分 2.1各成 ...
- Qt qml调试,qml性能分析和优化工具
QML语言为qt推出的用于界面编程的语言. 1)如何在qt creator中进行调试qml: 以Qt Creator 4.6.2为例: 在qt creator的debug模式下,可以直接在qml中打断 ...
- Java字符串无意识的递归
Java中的每个类基本上都继承自Object,标准容器类自然也不例外.因此容器类都有toString()方法,并且重写了该方法,使得它生成的String结果能够表达容器本身,以及容器所包含的对象.例如 ...
- 13 JSP、MVC开发模式、EL表达式和JSPL标签+软件设计架构---学习笔记
1.JSP (1)JSP概念:Java Server Pages 即java服务器端页面可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码用于简化书写!!! (2)原理 ...
- ModelSerializer组件
ModelSerializer组件 一 .DRF模型类序列化器 如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一 ...
- Mitsubishi (三菱) Fanuc(发那科),CNC,网口数据采集,NC程序下发(其它品牌CNC,哈斯 马扎克 兄弟等,正在开发中)
1.话不多说,先看效果 三菱CNC Fanuc CNC 2.能采集的数据有如下: 产量,状态,轴负载,坐标,主轴转速,三个倍率(主轴倍率 进给倍率 快速倍率),进给速度,当前加工程序名/程序号,当前程 ...
- springboot项目 配置https
感谢 https://www.jianshu.com/p/1b7b9e0803c6 帮我解决了问题 生成自签名证书 keytool -genkey -storetype PKCS12 -keysiz ...
- SSH协议介绍
SSH概念介绍 SSH是一种网络协议,我们常说的 ssh 一般指其实现,即 OpenSSH,在 shell 中,也就是 ssh 命令. Secure Shell(安全外壳协议,简称SSH)是一种加密的 ...
- nginx反向代理的一次实践
场景:前端(VUE.js)应用部署在linux服务器,需要支持http和https访问. 问题1:阿里服务器不支持域名访问? 通过域名绑定服务器解决 问题2:如何通过http访问前端 前端通过ngin ...