結果
| 問題 | No.430 文字列検索 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2020-11-13 15:34:36 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 1,102 bytes | 
| コンパイル時間 | 179 ms | 
| コンパイル使用メモリ | 82,560 KB | 
| 実行使用メモリ | 82,176 KB | 
| 最終ジャッジ日時 | 2024-11-10 00:49:04 | 
| 合計ジャッジ時間 | 5,735 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | -- * 4 | 
| other | AC * 1 TLE * 2 -- * 11 | 
ソースコード
import sys
input = lambda: sys.stdin.readline().rstrip()
S = input()
M = int(input())
Cs = [input() for _ in range(M)]
def kmp_count(string, word):
    # バックトラックテーブルの構築
    # T[i] : word の先頭が string[m] で、
    #        i 番目で不一致だったとき(i.e. string[m + i] != word[i])、
    #        word の先頭を m + i - T[i] にずらす。
    assert len(word) >= 1
    T = [0] * (len(word) + 1)
    T[0] = -1
    i = 2
    j = 0
    for i, c in enumerate(word[1:], start=2):
        if c == word[j]:
            j += 1
            T[i] = j
        elif j > 0:
            j = T[j]
    # print(word)
    # print(T)
    # 文字列検索
    m = 0
    i = 0
    ret = 0
    while m + i < len(string):
        if word[i] == string[m + i]:
            i += 1
            if i == len(word):
                ret += 1
                m = m + i - T[i]
                i = T[i]
        else:
            m = m + i - T[i]
            if i > 0:
                i = T[i]
    # print(ret)
    return ret
ans = 0
for C in Cs:
    ans += kmp_count(S, C)
print(ans)
            
            
            
        