結果
問題 | No.2626 Similar But Different Name |
ユーザー | timi |
提出日時 | 2024-02-10 10:58:54 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
AC
|
実行時間 | 1,476 ms / 3,000 ms |
コード長 | 1,846 bytes |
コンパイル時間 | 101 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 228,860 KB |
最終ジャッジ日時 | 2024-09-28 17:05:35 |
合計ジャッジ時間 | 40,900 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 471 ms
44,320 KB |
testcase_01 | AC | 474 ms
44,308 KB |
testcase_02 | AC | 471 ms
44,436 KB |
testcase_03 | AC | 464 ms
44,052 KB |
testcase_04 | AC | 470 ms
44,568 KB |
testcase_05 | AC | 469 ms
44,316 KB |
testcase_06 | AC | 467 ms
43,928 KB |
testcase_07 | AC | 470 ms
44,964 KB |
testcase_08 | AC | 470 ms
44,968 KB |
testcase_09 | AC | 470 ms
44,656 KB |
testcase_10 | AC | 476 ms
45,548 KB |
testcase_11 | AC | 474 ms
45,276 KB |
testcase_12 | AC | 469 ms
45,128 KB |
testcase_13 | AC | 468 ms
44,876 KB |
testcase_14 | AC | 482 ms
45,140 KB |
testcase_15 | AC | 474 ms
45,360 KB |
testcase_16 | AC | 478 ms
45,384 KB |
testcase_17 | AC | 490 ms
44,736 KB |
testcase_18 | AC | 1,450 ms
228,860 KB |
testcase_19 | AC | 1,435 ms
155,204 KB |
testcase_20 | AC | 1,439 ms
154,320 KB |
testcase_21 | AC | 1,175 ms
134,964 KB |
testcase_22 | AC | 1,455 ms
204,660 KB |
testcase_23 | AC | 1,454 ms
204,576 KB |
testcase_24 | AC | 1,471 ms
199,320 KB |
testcase_25 | AC | 1,470 ms
201,420 KB |
testcase_26 | AC | 1,475 ms
204,616 KB |
testcase_27 | AC | 1,476 ms
205,276 KB |
testcase_28 | AC | 1,467 ms
203,492 KB |
testcase_29 | AC | 1,385 ms
192,108 KB |
testcase_30 | AC | 1,417 ms
195,148 KB |
testcase_31 | AC | 1,410 ms
198,036 KB |
testcase_32 | AC | 1,403 ms
199,652 KB |
testcase_33 | AC | 1,412 ms
200,192 KB |
testcase_34 | AC | 1,403 ms
192,532 KB |
testcase_35 | AC | 1,415 ms
198,424 KB |
testcase_36 | AC | 1,387 ms
192,372 KB |
testcase_37 | AC | 1,428 ms
227,944 KB |
ソースコード
N,M,K=map(int, input().split()) S=input() T=input() A,B=[],[] for s in S: if s.islower(): A.append(1) else: A.append(-1) for s in T[::-1]: if s.islower(): B.append(1) else: B.append(-1) SS=S.lower() TT=T.lower() # 1-dimension Rolling Hash class RollingHash(): def __init__(self, s, base, mod): self.mod = mod self.pw = pw = [1]*(len(s)+1) l = len(s) self.h = h = [0]*(l+1) v = 0 for i in range(l): h[i+1] = v = (v * base + ord(s[i])) % mod v = 1 for i in range(l): pw[i+1] = v = v * base % mod def get(self, l, r): return (self.h[r] - self.h[l] * self.pw[r-l]) % self.mod base=37;mod = 10**9 +7 rs=RollingHash(SS,base,mod) rt=RollingHash(TT,base,mod) D=[];t=rt.get(0,M) for i in range(N-M+1): if t==rs.get(i,i+M): D.append(i) import numpy as np def convolve(f, g): """多項式 f, g の積を計算する。 Parameters ---------- f : np.ndarray (int64) f[i] に、x^i の係数が入っている g : np.ndarray (int64) g[i] に、x^i の係数が入っている Returns ------- h : np.ndarray f,g の積 """ # h の長さ以上の n=2^k を計算 fft_len = 1 while 2 * fft_len < len(f) + len(g) - 1: fft_len *= 2 fft_len *= 2 # フーリエ変換 Ff = np.fft.rfft(f, fft_len) Fg = np.fft.rfft(g, fft_len) # 各点積 Fh = Ff * Fg # フーリエ逆変換 h = np.fft.irfft(Fh, fft_len) # 小数になっているので、整数にまるめる h = np.rint(h).astype(np.int64) return h[:len(f) + len(g) - 1] f = np.array(A, np.int64) g = np.array(B, np.int64) H = list(convolve(f, g)) a,b=M-1-1,M-K-K ans=0 for d in D: c=H[d+M-1] if b<=c<=a: ans+=1 print(ans)