結果

問題 No.430 文字列検索
ユーザー tatyamtatyam
提出日時 2020-01-25 16:15:58
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
RE  
実行時間 -
コード長 2,734 bytes
コンパイル時間 80 ms
コンパイル使用メモリ 13,184 KB
実行使用メモリ 11,904 KB
最終ジャッジ日時 2024-11-10 00:40:16
合計ジャッジ時間 1,246 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
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:
    BASE = randint(1000,1000000)
    MOD = 2**61-1
    def __init__(self,S):
        self.hash = [0]*(len(S)+1)
        self.power = [1]*(len(S)+1)
        for i,s in enumerate(S,start=1):
            self.hash[i] = self.hash[i-1] * self.BASE + ord(s)
            self.hash[i] = (self.hash[i] & self.MOD) + (self.hash[i] >> 61)
            if self.hash[i] >= self.MOD:
                self.hash[i] -= self.MOD
            self.power[i] = self.power[i - 1] * BASE
            self.power[i] = (self.power[i] & self.MOD) + (self.power[i] >> 61)
            if self.power[i] >= self.MOD:
                self.power[i] -= self.MOD
            
    #S[l:r]のハッシュを取得する
    def get_hash(self,l,r):
        if r-l<0:
            print("r<l",(r,l),file=sys.stderr)
        ans = self.hash[r] - self.hash[l] * self.power[r-l] + self.MOD
        ans = (ans & self.MOD) + (ans >> 61)
        if ans >= self.MOD:
            ans -= self.MOD
        return ans





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