contents
關於這一周
練習 STL 的語法。 題目來源
好久沒有練 C++ 程序,這是一個訓練 STL 的題單。
練習項目
std::list
list.merge(other_list)
將 other_list 內容搬運到 list 後,other_list 清空。list.sort()
不依賴 std::sort, 自己內部有一個 sort()。list.unique()
跟另外一套的有點相似,一樣是要在排序後才能運行當作去重複。
std::set & std::multiset
insert()
find()
查找,後回傳 set<>::iterator 的型態。set<>::iterator
begin()
和end()
的型態。set<>::reverse_iterator
rbegin()
和rend()
的型態。erase()
特別小心這個,傳入如果是 iterator 的話,就只會刪除單一元素,如果對於 multiset 來說,傳入一般的值(不是迭代器指針) 則會將所有相同的都刪除。
std::string
find(str [, start_pos])
正向搜索 str 這個字串從 start_pos 開始算起。rfind()
逆向搜索 str 這個字串。substr(start_post, sub_length)
從某個位置開始,截出一段長度。
A - List
題目
总时间限制: 4000ms 内存限制: 65536kB
描述
写一个程序完成以下命令:
new id ——新建一个指定编号为id的序列(id<10000)
add id num——向编号为id的序列加入整数num
merge id1 id2——合并序列id1和id2中的数,并将id2清空
unique id——去掉序列id中重复的元素
out id ——从小到大输出编号为id的序列中的元素,以空格隔开
输入
第一行一个数n,表示有多少个命令( n <= 200000)。以后 n 行每行一个命令。
输出
按题目要求输出。
样例输入
16
new 1
new 2
add 1 1
add 1 2
add 1 3
add 2 1
add 2 2
add 2 3
add 2 4
out 1
out 2
merge 1 2
out 1
out 2
unique 1
out 1
样例输出
1 2 3
1 2 3 4
1 1 2 2 3 3 4
1 2 3 4
解法
|
|
B - Set
題目
总时间限制: 5000ms 内存限制: 100000kB
描述
现有一整数集(允许有重复元素),初始为空。我们定义如下操作:
add x 把x加入集合
del x 把集合中所有与x相等的元素删除
ask x 对集合中元素x的情况询问
对每种操作,我们要求进行如下输出。
add 输出操作后集合中x的个数
del 输出操作前集合中x的个数
ask 先输出0或1表示x是否曾被加入集合(0表示不曾加入),再输出当前集合中x的个数,中间用空格格开。
输入
第一行是一个整数n,表示命令数。0<=n<=100000。
后面n行命令,如Description中所述。
输出
共n行,每行按要求输出。
样例输入
7
add 1
add 1
ask 1
ask 2
del 2
del 1
ask 1
样例输出
1
2
1 2
0 0
0
2
1 0
解法
|
|
C - 字符串操作
題目
总时间限制: 1000ms 内存限制: 65536kB
描述
给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,长度为1-500,现有如下若干操作:
copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。
add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。
find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
insert S N X:在第N个字符串的第X个字符位置中插入S字符串。
reset S N:将第N个字符串变为S。
print N:打印输出第N个字符串。
printall:打印输出所有字符串。
over:结束操作。
其中N,X,L可由find与rfind操作表达式构成,S,S1,S2可由copy与add操作表达式构成。
输入
第一行为一个整数n(n在1-20之间)
接下来n行为n个字符串,字符串不包含空格及操作命令等。
接下来若干行为一系列操作,直到over结束。
输出
根据操作提示输出对应字符串。
样例输入
3
329strjvc
Opadfk48
Ifjoqwoqejr
insert copy 1 find 2 1 2 2 2
print 2
reset add copy 1 find 3 1 3 copy 2 find 2 2 2 3
print 3
insert a 3 2
printall
over
样例输出
Op29adfk48
358
329strjvc
Op29adfk48
35a8
解法
這一題算是裡面最繁瑣的一題,一部分是因為其輸入的規則需要遞歸分析。
而為了實現遞歸分析,需要可以偷看輸入的下一個 token,因此先把每一個 token 切出來放在 queue 裏頭。
|
|