結果

問題 No.430 文字列検索
ユーザー petite_progpetite_prog
提出日時 2020-01-25 14:09:27
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
RE  
実行時間 -
コード長 2,248 bytes
コンパイル時間 131 ms
コンパイル使用メモリ 12,928 KB
実行使用メモリ 11,904 KB
最終ジャッジ日時 2024-11-10 00:40:12
合計ジャッジ時間 1,591 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#
#     ⋀_⋀  
#    (・ω・)  
# ./ U ∽ U\
#  │* 合 *│
#  │* 格 *│ 
#  │* 祈 *│ 
#  │* 願 *│ 
#  │*   *│ 
#       ̄
#
import sys
sys.setrecursionlimit(10**6)
input=sys.stdin.readline
from math import floor,ceil,sqrt,factorial,hypot,log #log2ないyp
from heapq import heappop, heappush, heappushpop
from collections import Counter,defaultdict,deque
from itertools import accumulate,permutations,combinations,product,combinations_with_replacement
from bisect import bisect_left,bisect_right
from copy import deepcopy
from fractions import gcd
from random import randint
inf=float('inf')
mod = 10**9+7
def pprint(*A): 
    for a in A:     print(*a,sep='\n')
def INT_(n): return int(n)-1
def MI(): return map(int,input().split())
def MF(): return map(float, input().split())
def MI_(): return map(INT_,input().split())
def LI(): return list(MI())
def LI_(): return [int(x) - 1 for x in input().split()]
def LF(): return list(MF())
def LIN(n:int): return [I() for _ in range(n)]
def LLIN(n: int): return [LI() for _ in range(n)]
def LLIN_(n: int): return [LI_() for _ in range(n)]
def LLI(): return [list(map(int, l.split() )) for l in input()]
def I(): return int(input())
def F(): return float(input())
def ST(): return input().replace('\n', '')
class RollingHash:
    def __init__(self,S):
        self.mod = 2**61-1
        self.base = randint(1000, 1000000)
        self.hash = [0]*(len(S)+1)


        for i,s in enumerate(S,start=1):
            self.hash[i] = (self.hash[i-1] * self.base + ord(s)) % self.mod
        
    #S[l:r]のハッシュを取得する
    def get_hash(self,l,r):
        if r-l<0:
            print("r<l",(r,l),file=sys.stderr)
        return (self.hash[r] - self.hash[l] * pow(self.base, r-l, self.mod) ) % self.mod

def main():
    S=ST()
    RH = RollingHash(S)
    cnt = defaultdict(int)
    for l in range(len(S)):
        for r in range(l+1,l+11):
            if r>len(S):
                break
            cnt[RH.get_hash(l,r)] += 1

    M=I()
    ans = 0
    for _ in range(M):
        s = ST()
        h = RollingHash(s).get_hash(0,len(s))
        ans += cnt[h]
    print(ans)
if __name__ == '__main__':
    main()
0