結果

問題 No.430 文字列検索
ユーザー tatyamtatyam
提出日時 2020-01-25 16:23:48
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 3,244 bytes
コンパイル時間 96 ms
コンパイル使用メモリ 13,056 KB
実行使用メモリ 11,904 KB
最終ジャッジ日時 2024-11-10 00:40:17
合計ジャッジ時間 1,266 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 = (1<<61)-1
    # MASK31 = (1<<31)-1
    # MASK30 = (1<<30)-1
    def __init__(self,S):
        self.hash = [0]*(len(S)+1)
        self.pows = [1]*(len(S)+1)
        for i,s in enumerate(S,start=1):
            a = self.hash[i-1] * self.BASE + ord(s)
            a = (a >> 61) + (a & self.MOD)
            if a >= self.MOD:
                a -= self.MOD
            self.hash[i] = a
            a = self.pows[i-1] * self.BASE
            a = (a >> 61) + (a & self.MOD)
            if a >= self.MOD:
                a -= self.MOD
            self.pows[i] = a
        
    #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] * self.pows[r-l]) % self.MOD
        # return (self.hash[r] - self.hash[l] * pow(self.BASE, r-l, self.MOD) ) % self.MOD

    #https://qiita.com/keymoon/items/11fac5627672a6d6a9f6 メルセンヌ素数mod
    # def Mul(self,a,b):
    #     au,ad = a>>31, a&self.MASK31 ##上位30bitと下位31bit
    #     bu,bd = b>>31, b&self.MASK31 ##上位30bitと下位31bit

    #     mid = ad*bu + au*bd
    #     midu = mid>>30 
    #     midd = mid&self.MASK30 #2^31で割ったあまり
    #     return au*bu*2 + midu + (midd<<31) + ad*bd

    # def CalcMod(self,val):
    #     val = (val&self.MOD) + (val>>61)
    #     if (val>=self.MOD):
    #         val -= self.MOD
    #     return val






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