Code Formula 2014 C - 次世代SNS

備忘録

問題

atcoder.jp

回答

import sys
import os
import math
import bisect
import itertools
import collections
import heapq
import queue
import array
import time
import numpy as np
from numpy import linalg as LA

# 時々使う
# import numpy as np
# from decimal import Decimal, ROUND_HALF_UP
# from scipy.sparse.csgraph import csgraph_from_dense, floyd_warshall
# from collections import defaultdict, deque

# 再帰の制限設定
sys.setrecursionlimit(10000000)


def ii(): return int(sys.stdin.buffer.readline().rstrip())
def il(): return list(map(int, sys.stdin.buffer.readline().split()))
def fl(): return list(map(float, sys.stdin.buffer.readline().split()))
def iln(n): return [int(sys.stdin.buffer.readline().rstrip())
                    for _ in range(n)]


def iss(): return sys.stdin.buffer.readline().decode().rstrip()
def sl(): return list(map(str, sys.stdin.buffer.readline().decode().split()))
def isn(n): return [sys.stdin.buffer.readline().decode().rstrip()
                    for _ in range(n)]


def lcm(x, y): return (x * y) // math.gcd(x, y)


# MOD = 10 ** 9 + 7
MOD = 998244353
INF = float('inf')


def main():
    if os.getenv("LOCAL"):
        sys.stdin = open("input.txt", "r")

    S = iss()
    mx = len(S)
    i = 0
    alp = range(ord('a'), ord('z')+1)
    ret = set()
    while i < mx:
        if S[i] == '@':
            user = ''
            i += 1
            while i < mx and ord(S[i]) in alp:
                user += S[i]
                i += 1
            if len(user) > 0:
                ret.add(user)
        else:
            i += 1
    ret = list(ret)
    ret.sort()
    print(*ret, sep="\n")


if __name__ == '__main__':
    main()

考え方

与えられる文字列は最大140文字程度なので、
愚直に先頭から条件を判定します。
ただし、同じユーザー名が複数回出現する場合があるため、
ユーザー名の重複に注意が必要です。