結果

問題 No.430 文字列検索
ユーザー petite_progpetite_prog
提出日時 2020-01-25 14:44:07
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 2,911 bytes
コンパイル時間 114 ms
コンパイル使用メモリ 11,108 KB
実行使用メモリ 10,160 KB
最終ジャッジ日時 2023-10-12 04:34:16
合計ジャッジ時間 1,637 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
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
    MASK31 = (1<<31)-1
    MASK30 = (1<<30)-1
    def __init__(self,S):
        self.hash = [0]*(len(S)+1)
        for i,s in enumerate(S,start=1):
            self.hash[i] = self.CalcMod( self.Mul(self.hash[i-1], self.BASE) + ord(s) )
            # 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

    #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