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 ...
随机推荐
- 【电商日志项目之六】数据分析-Hive方式
环境 hadoop-2.6.5 hive-1.2.1 一.Hive和Hbase整合如果使用Hive进行分析,Hive要从Hbase取数据(当然可以直接将数据存到Hive),那么就需要将Hive和HBa ...
- IntellJ idea maven打包——项目带有第三方jar包
今天用maven打包时,提示程序包com.aspose.slides不存在 原来第三方jar是直接导入的,打包时没找到 那项目中带有第三方jar包,怎么打包? 方法: 1.根路径建立lib包,将第三方 ...
- node + promise 实现文件读写
const fs = require('fs'); const promise = new Promise((resolve, reject) => { fs.open('./c.txt ...
- 【转】Lombok介绍、使用方法和总结
链接:http://www.yuanrengu.com/index.php/20180324.html 1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a ...
- jinkins 部署过程
jinkins 概述 jinkins 本身是一个 webapp 项目,部署在了tomcat 环境下,就变成了一个网站.他有一个功能,就是构建,构建的时候做了什么事情? gitlab 获取代码 mave ...
- LeetCode 235. 二叉搜索树的最近公共祖先 32
235. 二叉搜索树的最近公共祖先 235. Lowest Common Ancestor of a Binary Search Tree 题目描述 给定一个二叉搜索树,找到该树中两个指定节点的最近公 ...
- Spring笔记3
动态代理** 特点:字节码随用随创建,随用随加载 作用:不修改源码的基础上对方法增强 分类: 基于接口的动态代理 基于子类的动态代理 基于接口的动态代理: 涉及的类:Proxy 如何创建代理对 ...
- ES(ElasticSearch)文档的表现形式以及增删改查
1. ES中的文档 ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document).然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索 ...
- 基于Snappy实现数据压缩和解压
Snappy是谷歌开源的一个用来压缩和解压的开发包.相较其他压缩算法速率有明显的优势,官方文档显示在64位 i7处理器上,每秒可达200~500MB的压缩速度,不禁感叹大厂的算法就是厉害. 开源项目地 ...
- 一个长耗时SQL在TiDB和Mysql上的耗时测试
之前看到的TiDB和MySql的性能对比都是大量短耗时请求下的压测,单机情况下TiDB和MySql的确有些差距,不过笔者最近碰到的场景更多是sql要扫描的行数不小的情况下单sql比较耗时的问题,所以自 ...