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 ...
随机推荐
- MiniProfiler 来分析 ASP.NET Core
使用 MiniProfiler 来分析 ASP.NET Core 应用 使用 MiniProfiler 来分析 ASP.NET Core 应用 MiniProfiler(https://minip ...
- springboot集成mybatisplus小例子
集成mybatisplus后,简单的CRUD就不用写了,如果没有特别的sql,就可以不用mapper的xml文件的. 目录 pom.xml文件 <?xml version="1.0&q ...
- sourcetree在mac上的使用
sourcetree是git在Mac上管理代码的ui工具,当然你也可以使用命令直接使用git来管理代码,sourcetree下载下载地址:https://www.sourcetreeapp.com. ...
- java方法重写的规定
java方法重写的规定: 方法的声明: 权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{ // 方法体 } 子类中的叫重写的方法, 父类中的叫被重写的方法 子类重写的方法的方法名 ...
- 微信小程序访问豆瓣电影api400错误解决方法
最近在跟着demo学习微信小程序,却卡在了第一步请求豆瓣电影api上,折腾了很久,代码如下: wx.request({ url : "https://api.douban.com/v2/mo ...
- Java反射桥接方法解析
在阅读mybaits源码的反射模块时,看到了如下的一段代码: /** * 添加 Method 数组到 uniqueMethods * @param uniqueMethods * @param met ...
- C++的派生类构造函数是否要带上基类构造函数
//public:Student(int s_age):People(s_age) //C++的派生类构造函数后面是否带上基类构造函数,取决于基类构造函数是否需要传入参数,如果要参数,就一定带上:不需 ...
- leetcode tree相关题目总结
leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ...
- Nginx 配置 HTTP 跳转 HTTPS-Linux运维日志
本文介绍 Nginx 访问 HTTP 跳转 HTTPS 的 4 种配置方式. rewrite Nginx rewrite 有四种 flag: break:在一个请求处理过程中将原来的 url 改写之后 ...
- logrus 剖析之 hook
logrus 通过实现 Hook接口扩展 hook 机制,可以根据需求将日志分发到任意的存储介质, 比如 es, mq 或者监控报警系统,及时获取异常日志.可以说极大的提高了日志系统的可扩展性. ho ...