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 ...
随机推荐
- RobotFramework与Jenkins集成后发送groovy报告(比别处多了用例作者信息)
https://www.cnblogs.com/gcgc/p/10037891.html 这篇文章中最终的发送报告是这个样子,每天大家看到这封邮件后也不知道是不是自己的用例错误了,导致大家不积极回复邮 ...
- windows下大数据开发环境搭建(1)——Java环境搭建
一.Java 8下载 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载之后 ...
- 14 SpringMVC框架的基本概念
1.三层架构 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就是浏览器服务器.在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发. ...
- 完全卸载MySQL服务
1.控制面板——>所有控制面板项——>程序和功能,卸载mysql server! 2.删除MySQL文件,尤其是ProgramData里面的隐藏文件MySQL,我当时没有删除,重新安装My ...
- 【转帖】两年Flink迁移之路:从standalone到on yarn,处理能力提升五倍
两年Flink迁移之路:从standalone到on yarn,处理能力提升五倍 https://segmentfault.com/a/1190000020209179 flink 1.7k 次阅读 ...
- Linux 进程间通信(管道、共享内存、消息队列、信号量)
进程通信 : 不同进程之间传播或交换信息 为什么要进程通信呢? 协同运行,项目模块化 通信原理 : 给多个进程提供一个都能访问到的缓冲区. 根据使用场景,我们能划分为以下几种通信 ...
- array_walk、array_map、array_filter 的用法
array_walk.array_map.array_filter 和 foreach 都有循环对数组元素进行处理的功能. 一.array_walk 用法 1.循环数组,回调处理(并不修改数组元素的 ...
- Verilog的各种坑
Verilog语言和软件语言不一样,有些时候理所当然的编写,也没有报语法错误,可是功能就是不对.唉,把遇到的坑都记在本篇博客吧. 1. initial begin...end里面不能有always,如 ...
- Latex局部字体大小设置
tex 设置字体大小命令由小到大依次为: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \ ...
- C# HtmlAgilityPack爬取静态页面
最近对爬虫很感兴趣,稍微研究了一下,利用HtmlAgilityPack制作了一个十分简单的爬虫,这个简易爬虫只能获取静态页面的Html HtmlAgilityPack简介 HtmlAgilityPac ...