読者です 読者をやめる 読者になる 読者になる

AtCoder Regular Contest 033

はい。 お出かけしてたので参加できなかった(´・ω・`)
http://arc033.contest.atcoder.jp/

A - 隠れた言葉

ざっくりと大意

・部分文字列の個数を出力?? 「すぬけ」という文字列はす, ぬ, け, すぬ, ぬけ, すぬけの6つである。

方針のようなもの

・おそらく公式のようなものあるだろうけどとりあえずは2重ループで。

n=int(raw_input())
ans=chk=0
for i in range(1,n+1):
    for j in range(n):
        if j+i>n:
            break
        ans+=1
print ans

外側のループで探す文字列長、内側で開始位置にして回す。探す文字列長が開始位置から末尾をはみ出すようになったらbreakして、文字列長を1つ長くしてまた先頭から数えてたらなんとか計算が合った。
けどまぁ式が1行で求まるものだったらしいです。 (N*(N+1)/2) なんとなく覚えておけばその内にまた役立つことがあるかな。

B - メタ構文変数

ざっくりと大意

メタ構文変数の集合の Jaccard 係数を1行に出力する。なるほどわからん。
・\(S_A\)と\(S_B\)の両方に現れる要素の個数 / \(S_A\)と\(S_B\)の少なくともどちらか一方に現れる要素の個数 を出力するらしい。

方針のようなもの

・両方に現れる要素の個数と少なくともどちらか一方に現れる要素の個数をなんとか数える。ちなみに少なくともどちらか一方に現れる要素とは両方に現れているものも含みます。

a,b=map(int,raw_input().split())
ant=set([s for s in raw_input().split()])
bug=set([s for s in raw_input().split()])
ans=chk=0
c=ant.union(bug)
print (a*1.0+b-len(c))/len(c)

入力の時点では重複の要素はないはずだけど後でset型でしか使わないので最初からset型で。その後に多分set型は単純に+では2つのsetを結合できないっぽいので ant.union(bug) で2つを1つにする。antとbugは前後を入替えても出来上がるsetの中身は同じです。
2つのsetを1つにすると少なくともどちらか一方に現れる要素の個数になって、それがわかると元々のそれぞれ要素の個数の和からの差を求めると両方に現れる要素の個数になるので割ると解になる。
入力受取を試してみたけど、

ant=set([s for s in raw_input().split()])

ant=[s for s in raw_input().split()]
ant=set(ant)

ant=set(map(str, raw_input().split()))

ant=map(str, raw_input().split())
ant=set(ant)

1から100000まで重複のない数では特に早い遅いの差は出なかった。むしろstrではなくintにすると共通でやや遅くなってた。
5555を100000個の入力にしたら2行に分けて受け取ったほうが早いっぽかった。検証は適当ですけど。。
と思ったけどそもそもint型にキャストしないんだったら受取は raw_input().split() だけでも良かったので調査するのには色々足りなかったっぽい。