君はまるで砂漠に咲く、一輪の花。

僕はその花に引き寄せられる蝶。

Codeforces Beta Round #5

はい。

A. Chat Server's Outgoing Traffic

implementation

ざっくりと大意

・チャットがある。+名前で入室、-名前で退室。
・名前は大文字/小文字区別しなければならない。
・名前:〜でメッセージが送信されてる。
・入室人数(発言者自身を含む)*送信された文字数を計測する。

方針のようなもの

・入力文字列の先頭をみて+なら追加、-なら取り除く。
・先頭が+-どちらでもなければ発言のはずなので、:以降の文字長と入室人数を掛け算する。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import time
import sys, io
import re, math
start = time.clock()
ans=0
login=[]
for i in sys.stdin:
    if i[0]=='+':
        login.append(i[1:-1])
    elif i[0]=='-':
        login.remove(i[1:-1])
    else:
        j=i[:-1].split(':')
        ans+=len(j[1])*len(login)

はい。リストに全部名前を放り込んでましたが+なら人数カウンターを+1、-なら人数カウンターを-1という感じでも良かったようです。 問題文をよく読んでないので同名の人が存在しないことが保証されてるかどうかは知らじ。 と書いたあとに気づいたけど同名の人が存在しうるか否かに関わらず+-するだけで良かったっぽい。人数をset型で管理して同名の人がいたら計算がずれましたけど。。。 未だに標準入力の受け取りすらままならないあやふやなレベルで綺麗っぽい方法を見かけたのでメモ

while True:
    try:
        str = raw_input()
    except:
        break
    if ~

通常時はtry以下のraw_input()で受け取って、例外時/入力が終わった時はexcept以下breakで処理を抜ける感じなのかな。そしてその以降でifで何らかの処理。即時処理が必要ない場合はひたすらappendして抜けてから処理かも。

B. Center Alignment

ざっくりと大意

・文字を*で囲んだ枠で整形する。
・左右の余りの半角スペースが均等に分けられないパターンの出現時は初回は左に1つ多く半角スペース、2回目は右に多くして3回目は左に多くしてというループで整形する。

方針のようなもの

・問題文をよく読んでサンプルをよく見る。

l=[]
chk=0
while 1:
    try:
        w=raw_input()
        l.append(w)
        chk=max(chk,len(w))
    except:
        break
print '**'+'*'*chk
f=0
for i in range(len(l)):
    p=chk-len(l[i])
    if p%2==0:
        print '*'+' '*(p/2)+l[i]+' '*(p/2)+'*'
    else:
        if f%2==0:
            print '*'+' '*(p/2)+l[i]+' '*((p/2)+1)+'*'
        else:
            print '*'+' '*((p/2)+1)+l[i]+' '*(p/2)+'*'
        f+=1
print '**'+'*'*chk

問題文をよく読んでなくて無駄にずっと放置してた。きちんと読んで整形のルールを把握すれば特に引っ掛けも無いと思う。

C. Longest Regular Bracket Sequence

ざっくりと大意

・()の閉じが出来ている最長区間の長さとその個数を出力する。閉じが出来ていなければ0 1を出力する。
・サンプルの1は ((()))) と *1 で最長区間6が2個あるので 6 2 を出力が正解になる。

方針のようなもの

・後で

*1:)(