CodeForces 190C STL

Portal: http://codeforces.com/problemset/problem/190/C

一道卡输入输出的蛋疼题

题意:给你一个由pair和int所组成的沙茶字符串(最大含有1e5个单词),输出合法的pair序列

这道题可以拿栈做,也就是vector或stack

呵呵 (vector==stack)=1

Examples

Input

3pair pair int int int

Output

pair<pair<int,int>,int>

 1 #include<iostream>
 2 #include<cstring>
 3 #include<sstream>
 4 #include<vector>
 5 using namespace std;
 6 #define FOR(i,j,k) for(int i=j;i<=k;i++)
 7 #define FORD(i,j,k) for(int i=j;i>=k;i--)
 8 #define maxn 100010
 9 #define SZ(x) int(x.size())
10 int k;
11 int a[maxn];
12 pair<int,int> res[maxn];
13 vector<int> zz;
14 string s;
15 stringstream ss,ans;
16 void cq(int l)
17 {
18     if(a[l])
19     {
20         ans<<"pair<";
21         cq(res[l].first);
22         ans<<‘,‘;
23         cq(res[l].second);
24         ans<<‘>‘;
25     }
26     else ans<<"int";
27     return;
28 }
29 int main()
30 {
31     getline(cin,s);
32     getline(cin,s);
33     ss<<s;
34     while(!ss.eof())
35     {
36         ss>>s;
37         a[++k]=(s=="pair");
38     }
39     FORD(i,k,1)
40     {
41         if(a[i])
42         {
43             if(SZ(zz)<2)
44             {
45                 cout<<"Error occurred"<<endl;
46                 return 0;
47             }
48             res[i].first=zz.back();
49             zz.pop_back();
50             res[i].second=zz.back();
51             zz.pop_back();
52         }
53         zz.push_back(i);
54     }
55     if(SZ(zz)>1) {
56             cout<<"Error occurred"<<endl;
57             return 0;
58             }
59     cq(1);
60     cout<<ans.str();
61     return 0;
62 }

无敌的sstream与蛋疼的getline

然后除了这个反人类的倒着处理我还写了个正着来的

 1 #include<iostream>
 2 #include<cstring>
 3 #include<sstream>
 4 using namespace std;
 5 #define FOR(i,j,k) for(int i=j;i<=k;i++)
 6 #define FORD(i,j,k) for(int i=j;i>=k;i--)
 7 #define maxn 100010
 8 #define SZ(x) int(x.size())
 9 string s;
10 stringstream ss,ans;
11 bool cq()
12 {
13     if(ss.eof()) return false;
14     ss>>s;
15     if(s=="pair")
16     {
17         ans<<"pair<";
18         if(!cq()) return false;
19         ans<<‘,‘;
20         if(!cq()) return false;
21         ans<<‘>‘;
22     }
23     else ans<<"int";
24     return true;
25 }
26
27 int main()
28 {
29     getline(cin,s);
30     getline(cin,s);
31     ss<<s;
32     if(cq()&&ss.eof()) cout<<ans.str(); else cout<<"Error occurred"<<endl;
33     return 0;
34 }

爽!

总之就是各种sstream大法好啦~

#include<sstream>
stringstream ss;

ss<<s;
ss>>s;
ss.eof()
时间: 2024-10-09 04:34:22

CodeForces 190C STL的相关文章

codeforces 527C:STL set

x和y各用一个set保存切割点 L[k] H[k]记录长度为k的线段有几个 每添加一个切点,更新L[] H[],然后找到各找到最大值,相乘就是答案 关键是学学set的使用 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 5

Codeforces 190C(模拟)

坑点 不记它难解我心头之恨-- WA1:不要读错题Orz,顺序是按它给定的.那就是个类似栈的东西,重点在于输出. 然而我输出很快就模拟对了-- WA2:数据:1 int.我日了不看数据我真的去de模拟的bug了. WA3:中间栈空是非法. 貌似建一棵树可以迅速搞掉--擦 #include <cstdio> #include <cstring> #include <iostream> #include <string> #include <vector&

Codeforces 701C They Are Everywhere(Two pointers+STL)

[题目链接] http://codeforces.com/problemset/problem/701/C [题目大意] 给出 一个字符串,里面包含一定种类的字符,求出一个最短的子串,使得其包含该字符串中的所有种类的字符 [题解] 利用双指针,每次找到包含所有字符的串,用这个串的长度去更新答案,在判断该字符在选定串中出现次数的时候可以调用map,而统计不同种类字符个数则可以利用STL中的set进行统计. [代码] #include<set> #include<map> #inclu

【STL】Codeforces 696A Lorenzo Von Matterhorn

题目链接: http://codeforces.com/problemset/problem/696/A 题目大意: 一个满二叉树,深度无限,节点顺序编号,k的儿子是k+k和k+k+1,一开始树上的边权都为0 N(N<=1000)个操作,操作两种,1是从u到v的路径上的所有边权+w,2是求u到v的边权和.(1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109) 题目思路: [STL] 用map写很快,第一次用很生疏.现学只看了一点点. 因为是满二叉树所以直接暴力求LCA和求解,

[Codeforces 1246B] Power Products (STL+分解质因数)

[Codeforces 1246B] Power Products (STL+分解质因数) 题面 给出一个长度为\(n\)的序列\(a_i\)和常数k,求有多少个数对\((i,j)\)满足\(a_i \times a_j = x^k (x \in \mathbb{N}^+)\).即这两个数乘起来恰好为一个正整数的\(k\)次方 \(a_i,n \leq 10^5\) 分析 考虑\(x^k\)的质因数分解式 , 那么每一项的指数一定是k的倍数,即 \(k|x_i\). 因此对于每个 \(a_i\)

Codeforces Round #Pi (Div. 2) (STL专场)

Codeforces Round #Pi (Div. 2) A - Lineland Mail 水题,拼手速. /* * @author Novicer * language : C++/C */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #include<queue

codeforces #296 div2 (527C) STL中set的运用

题意:在一块H*M的玻璃上每次划一刀(仅仅能水平或竖直).输出每次划开之后剩下的玻璃中面积最大的一块的面积. 做题的时候.觉得这么大的数据量,有每次查询输出,应该是数据结构的内容. 这道题能够用STL中的set容器来非常好地解决~set容器其本身就是用红黑树这样的数据结构来实现的.所以和原来的推測并不相悖.STL平时用的并不多.里面的一些函数非常生疏,熟悉一下 解题思路: 首先建立两个set型容器 ,每次分割都将分割的位置h或w插入到set中,因为set可以自己主动排序.运用两个函数lower_

CodeForces #100 C 贪心+STL

题目链接:CodeForces #100  C 题意:现在给出n个snowball的半径,3个半径严格递增或递减的snowball,可以组成1个snowmen.问最多能组成多少个snowmen.并且按照半径递减的顺序输出每个snowmen的组成. 思路:嗯...每次都从前三个个数最多的snowball里选择,最后组成的snowmen最多... ...可以用优先队列写..但是感觉set+map写的太优雅了...map当然不等于数组了...哼. #include <stdio.h> #includ

CodeForces 1000A Codehorses T-shirts(STL map、思维)

https://codeforces.com/problemset/problem/1000/A 题意: 有n个人,给出每个人的衣服的尺码,现在,将这n件衣服的尺码换成另外的n种尺码,如果有尺码一样的衣服,则不需要换,问,最少需要更换几件衣服. 思路: map记录一下每种尺码的衣服出现的次数,然后对新尺码进行一一比对,如果新尺码的数量大于原有的,则说明要更换数量为二者差值的衣服. 代码:  1 #include <stdio.h> 2 #include <string.h> 3 #