atcoder ABC310 C - Reversibleの解答

atcoder.jp

・考え方:二分探索で解ける。まず、setにして重複を消す。次に反転文字列が文字列全体にないか、二分探索してあったら答えを-1する。

import bisect
n=int(input())
s=[]
for _ in range(n):
  s.append(input())
  
s=list(set(s))   #setで重複を消す
ns=len(s)
s.sort()


for i in range(len(s)):
  #先頭を消す。自分自身を参照しないため。
  p=s.pop(0)
  
  #p[::-1]でpの反転文字
  l=bisect.bisect_left(s,p[::-1])
  r=bisect.bisect_right(s,p[::-1])

  #p[::-1]がsの中にあったら、答えを-1。なかったら、pをもとに戻す。
  if l!=r:
    ns-=1
  else:
    s.append(p)
print(ns)