๋ฌธ์
์์์ด์ ์น๊ตฌ๋ค์ ์ ๋ ๋ฉ๋ด๋ฅผ ์ ์ ํํ์ง ๋ชปํ๋ค. ๋ฐฐ๊ฐ ๊ณ ํ ์์์ด๊ฐ ๋ณด๋ค ๋ชปํด ๋ฉ๋ด๋ฅผ ์ ํ๊ณค ํ๋๋ฐ ์ด๋ง์ ๋ ๋ฐ๋์ ๋ถ๋ชํ๋ ๊ฒฝ์ฐ์๋ ์์์ด๊ฐ ์ํ ๋ฃฐ๋ ์ ๋๋ ค ๊ฒฐ์ ํ๊ณค ํ๋ค. ์ด ์ํ ๋ฃฐ๋ ์ผ๋ก ๋ฉ๋ด๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋ ํนํ๋ฐ, ์ํ ๋ฃฐ๋ ์ ๋๋ฆฐ ๋ค 12์๋ถํฐ ์๊ณ๋ฐฉํฅ์ผ๋ก ์ฝ์ด์ ๋์ค๋ ๋ชจ์์ผ๋ก ์ ๋ ๋ฉ๋ด๋ฅผ ๊ฒฐ์ ํ๋ค. ์ํ ๋ฃฐ๋ ์๋ ์ ํํ N๊ฐ๋ก ๋๋์ด์ง ์นธ์ด ์กด์ฌํ๊ณ , ๊ฐ ์นธ์๋ ์ํ๋ฒณ ๋๋ฌธ์ ํ๋๊ฐ ์จ์ ธ์๋ค. ๋ํ ์ํ ๋ฃฐ๋ ์ 12์ ๋ฐฉํฅ์ ์กด์ฌํ๋ ํ์ดํ๋ ์นธ ์ฌ์ด์ ๊ฑธ์น๋ ์ผ์ด ์์ด ํญ์ ํ๋์ ํน์ ํ ์นธ์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ฉฐ, ์ํ ๋ฃฐ๋ ์ ๋๋ ธ์ ๋, N๊ฐ์ ์นธ์ด 12์์ ์กด์ฌํ๊ฒ ๋ ํ๋ฅ ์ ๋ชจ๋ ๊ฐ๋ค.
์์
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ํ ๋ฃฐ๋ ์ ์นธ ์ N(1 โค N โค 1,000,000)์ด ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค์๋ ์ ๋ ๋ฉ๋ด๋ก ๊ณ ๊ธฐ๋ฅผ ์ ํํ๊ฒ ๋๋ ์ํ ๋ฃฐ๋ ์ ๋ชจ์์ด 12์ ๋ฐฉํฅ๋ถํฐ ์๊ณ๋ฐฉํฅ์ผ๋ก ๊ณต๋ฐฑ์ ๊ตฌ๋ถ์ผ๋ก ํ ๊ธ์์ฉ N๊ฐ ์ฃผ์ด์ง๋ค. ์ธ ๋ฒ์งธ ์ค์๋ ํ์ฌ์ ์ํ ๋ฃฐ๋ ๋ชจ์์ด 12์ ๋ฐฉํฅ์ผ๋ก๋ถํฐ ์๊ณ๋ฐฉํฅ์ผ๋ก ๊ณต๋ฐฑ์ ๊ตฌ๋ถ์ผ๋ก ํ ๊ธ์์ฉ N๊ฐ ์ฃผ์ด์ง๋ค.
9
I W A N T M E A T
E A T I W A N T M
์ถ๋ ฅ
์ํ ๋ฃฐ๋ ์ ๋๋ ธ์ ๋ ์ค๋ ์ ๋ ์ผ๋ก ๊ณ ๊ธฐ๋ฅผ ์ ํํ๊ฒ ๋๋ ํ๋ฅ ์ ๊ธฐ์ฝ๋ถ์ ํํ๋ก ์ถ๋ ฅํ๋ค. ๊ธฐ์ฝ๋ถ์๋ ๋ถ์์ ๋ถ๋ชจ๊ฐ ๋ ์ด์ ์ฝ๋ถ์ด ์ ๋๋ ํํ๋ฅผ ์๋ฏธํ๋ค. ๋ง์ฝ ๋ฃฐ๋ ์ด ์ด๋ค ๊ณณ์ ๋ฉ์ถฐ๋ ๊ณ ๊ธฐ๋ฅผ ๋จน์ ์ ์๋ค๋ฉด 1/1 ์ ์ถ๋ ฅํ๋ค. ์ํ ๋ฃฐ๋ ์ ๋๋ ค ๊ณ ๊ธฐ๋ฅผ ๋จน์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ ์ ์ด๋ ํ ๊ฐ์ง ์ด์ ์๊ธฐ ๋๋ฌธ์ ๋ถ์๊ฐ 0์ด ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
1/9
ํธ๋ ๋ฒ
kmp ์๊ณ ๋ฆฌ์ฆ : ๋ฌธ์์ด(s) ์์ ํน์ ํจํด(m) ์ ํจ๊ณผ์ ์ผ๋ก (O(m+s) ๋ง์) ์ฐพ์์ฃผ๋ ๋ฌธ์์ด ์๊ณ ๋ฆฌ์ฆ (ํจํด์ด ์กด์ฌํ๋ค๋ฉด) KMP ์๊ณ ๋ฆฌ์ฆ
์ต๋๊ณต์ฝ์ ๊ตฌํ๊ธฐ : a,b์ ์ต๋๊ณต์ฝ์๋ a,b ์ค ํฐ ์๋ฅผ ์์ ์๋ก ๋๋ ๋๋จธ์ง์ a,b ์ค ์์ ์์ ์ต๋๊ณต์ฝ์์ ๊ฐ๋ค ์ด์ฉ (์ฌ์ค ์ด ๋ฐฉ๋ฒ์ด ์ฝ๋์น ๋ ๋๋ฌด ๊ณต์์ฒ๋ผ ์จ์ ๊ทธ๋ฅ ์ธ์ฐ๋ค๊ฐ ์ด๋ฒ์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ด๋ผ๋ ๋ช ์นญ์ ์๊ฒ ๋์๋ค)
I W A N T M E A T
E A T I W A N T M
์์ I W A N T M E A T ์ string ์ผ๋ก ๋ณด๊ณ E A T I W A N T M ์ pattern ์ผ๋ก ๋ณธ๋ค๋ฉด begin ์ด 1 ์ฆ๊ฐํ๋ค๋ ์๋ฏธ๋ ๋ฃฐ๋ ์ด ํ ๋ฒ ์ํ๋ฒณ ์ธ๋ฑ์ค๊ฐ ๋ฐ๋์ด์ ๋ฉ์ถ๋งํผ ํ์ ํ๋ค๋ ๋ป์ผ๋ก ๋ณผ ์ ์๋ค. ์ฆ E A T I W A N T M ์์ ์๊ณ๋ฐฉํฅ ํ์ ์ ์์ํ ๋ฃฐ๋ ์ด ๋ฉ์ถ๋ ๊ฐ ์์ ์ KMP ์๊ณ ๋ฆฌ์ฆ์์ begin ์ด 1 ์ฆ๊ฐํ ๋์ด๋ค.
kmp ์ฐ์ตํ๊ธฐ ์ํด์ ์ ํํ ๋ฌธ์ ์ฌ์ ๋ฐฉ๋ฒ์ ์์์ง๋ง ์ ์ด์ kmp ์๊ณ ๋ฆฌ์ฆ์ด ์ดํดํ๋๋ฐ ๋๋ฌด๋๋ฌด ์ด๋ ค์ ๊ธฐ ๋๋ฌธ์ ๋ง์ด ํค๋งธ๋ค.
๊ตฌํ ๋ฐฉ๋ฒ์์ ์๋ชป ์๊ฐํ๋ ๋ถ๋ถ, ์ฃผ์ํ ๋ถ๋ถ์ ์ ๋ฆฌํ์๋ฉด
- kmp ์ ๊ฑธ๋ฆฌ๋ while ์กฐ๊ฑด (ํด๋น ๋ฌธ์ vs ์ kmp ์๊ณ ๋ฆฌ์ฆ)
๋ฐฑ์ค ๋ฌธ์ : while b<=๋ฌธ์์ด ๊ธธ์ด(=ํจํด ๊ธธ์ด)
์๋ kmp ์๊ณ ๋ฆฌ์ฆ : while b<=๋ฌธ์์ด ๊ธธ์ด-ํจํด ๊ธธ์ด
b๋ ์ปค์ง๊ณ m๋ ์ปค์ง๋ฏ๋ก ์ ํ์ ํด์ค์ผ ํจ, b๋ m ํ๋๋ผ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด while ์ข ๋ฃํด์ผํ๋ค.
(์ฌ๊ธฐ์ b๋ begin, m์ match)
์ ์๊ณ ๋ฆฌ์ฆ์์๋ ํจํด ๊ธธ์ด๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์์ด ๊ธธ์ด๋ณด๋ค ์งง๊ณ ํด๋น ๋ฌธ์์ด ๋ฒ์ฃผ ๋ด์ ํจํด์ด ์ด๋์ ์กด์ฌํ๋์ง๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์ ์ด์ ๋ฌธ์์ด ๋ด ๋น๊ต๋ฅผ ์์ํ๋ begin ์ ์ธ๋ฑ์ค๊ฐ ํจํด์ ์ ์ผ ๋ ์ธ๋ฑ์ค๋ณด๋ค๋ ๋์ด๊ฐ๋ฒ๋ฆฌ๋ฉด ๋ฌธ์์ด์์ ๋จ๋ ๋ถ๋ถ์ ์ ์ด์ ํจํด๋ณด๋ค ์งง์ผ๋ฏ๋ก ๊ทธ ์ดํ๋ถํฐ๋ ํจํด์ ์์ ์ฐพ์ ์ ์๋ ์ธ๋ฑ์ค๋ก ๋ณด๊ณ ์ข ๋ฃํด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด ๋ฌธ์ ์์๋ ๋ฃฐ๋ ์ด ์๊ณ ๋ฐฉํฅ ํ ๋ฐํด ํ์ ์ ๋ง์น๊ณ ์๋ ์๋ ์๋ฆฌ๋ก ๋์์ฌ ๋๊น์ง begin์ด ํ๋ ์ฆ๊ฐํ ๋๋ง๋ค ๋ฐ๋์ ์ ๋ ๋ฉ๋ด ๋ฌธ์์ด์ด ๋์๋์ง ๋งค๋ฒ ํ์ธํด์ค์ผํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด ๊ธธ์ด ๋๊น์ง ๊ฒ์ฌํด์ผํ๋ค. (๋จ kmp ์๊ณ ๋ฆฌ์ฆ์ด๋ฏ๋ก ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๊ฒ์ฌํด์ฃผ๋ ๊ทธ ๊ณผ์ ์์ ์ฌ์ด์ฌ์ด ๋ฐ์ด๋์ ๋ถ๋ถ์ ๋ฐ์ด๋๋ ๊ฒ ! ์ด์ดํ๊ฒ ๋ชจ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฒ์ฌํ์ง ์๋ ๊ฒ์ด kmp ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ !)
๋ m ๋ ๋์์ด ์ฆ๊ฐํ ์ ์์ผ๋ฏ๋ก m<=len(self.pattern) - 1 ์ด๋ ๊ฒ ์กฐ๊ฑด์ ๊ฑธ์ด์ค์ผํ์ง๋ง ์์ ์์ ์ค์ฒฉ if ๋ฌธ์ ๊ฑธ์ด์ match ๊ฐ ํจํด ๊ธธ์ด๋งํผ ๋๋ฌํ์ ๋ match๋ฅผ ๋ค์ ๊ฒ์ฌ์ ๋ง๊ฒ๋ ์ฌ์ธํ ํด์ฃผ์๋ค.
-
failure ํจ์์์ ๊ฐ์ด 0์ธ ๊ฒ์ ์๋ฌด ๋์์ด ๋์ง ์๋๋ค
๊ฒฐ๊ตญ kmp ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด ๋ฌธ์์ด์์ ์ผ์ ๊ธธ์ด์ prefix์ suffix๊ฐ ์ผ์นํ๋ ๋ถ๋ถ ๋ฌธ์์ด์ด ์์ ๊ฒ์ด๊ณ ์ด๋ฅผ ํ์ฉํ๊ฒ ๋ค๋๊ฒ ์์ง์ด๋ค. ๊ทธ๋ฆฌ๊ณ prefix์ suffix๊ฐ ์ ์ฒด ๋ฌธ์์ด์ ์ฌ๋ผ์ด์ฑํ ๊ฐ ๋ถ๋ถ์์ ์ผ๋ง๋ ์ผ์นํ๋์ง๋ failure ํจ์์ ํด๋น ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ์ผ๋ก ์ ์ ์๋ค. ์ฆ ๊ฐ์ด 0์ธ failure ํจ์์ key ๋ ์ ์ด์ kmp ์์ ์ ํ ํ์ฉํ ์๊ฐ ์์ผ๋ฏ๋ก ์ธ๋ชจ๊ฐ ์๋ค. failure ํจ์๋ฅผ ๊ตฌํ ๋ ์ด ๋ถ๋ถ์ ์๊ฐํ๋ค๋ฉด failure ํจ์ ์์ฒด๊ฐ ๋ฌธ์์ด๋ ํจํด,ํจํด๋ ํจํด์ผ๋ก ๋์ด์๋ ๋ ํ๋์ kmp ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๊ฒ์ ์ ์ถํ ์ ์๋ค. ๋ฐ๋ผ์ kmp ์์ ์ ์ด์ ํจํด์ด ๋๊ธฐ ๊ทธ๋ฅธ ์ ๋ค์ ๋ค ๋ฐ์ด๋๋ ๊ฒ์ด ํต์ฌ์ด๋ฏ์ด failure ํจ์๋ฅผ ๊ตฌํํ ๋๋ match๊ฐ 0์ด์ด์ ์ธ๋ชจ์๋ ์ ๋ค์ ๋ฐ์ด๋์ ์๊ฐ ์๋ค.
-
failure ํจ์์ ๊ฑธ๋ฆฌ๋ while ๋ฌธ์ ์กฐ๊ฑด
๋ฐฑ์ค ๋ฌธ์ , ์ kmp ์๊ณ ๋ฆฌ์ฆ : while b+m<ํจํด์ ๊ธธ์ด
failure ํจ์ f(begin+match-1)=match ์์ begin+match-1์ ์ด๋ ์ธ๋ฑ์ค๊น์ง ์ฌ๋ผ์ด์ฑํ ๊ฒ์ธ์ง๋ฅผ ๋งํด์ค๋ค. ์๋ฌด๋ฆฌ m ์ด ์ ์ ๋์ด๋ ๋ฌธ์์ด ๋งจ ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ์ฌ๋ผ์ด์ฑํ์ ๋ (=์ฆ ํ๋๋ ์ฌ๋ผ์ด์ฑ ์ ํ ์ ์ฒด ๋ฌธ์์ด) ์์ prefix์ suffix๊ฐ ์ผ์นํ๋ ์ต์ฅ prefix ๋ฅผ ๊ตฌํ๋ ๋ฐ ๊ทธ์ณ์ผํ๋ค. ๊ทธ ์ด์์ผ๋ก๋ m ์ด ์ฆ๊ฐํ๋ฉด ์ ๋๋ค.
-
ํ๋ฒ ํจํด์ด ์กด์ฌํ๋ ๋ถ๋ถ์ ๋ฐ๊ฒฌํ ํ ๊ทธ ํ์ ๊ฒ์ฌ๋ ?
์ด ๋ถ๋ถ์ด ํฌ์ธํธ์ธ ๊ฒ ๊ฐ๋ค. ์ฌ์ค ์ฌ๊ธฐ๋ฅผ ์๋ชปํด์ kmp ๋ฅผ ์ผ๋๋ฐ๋ 4๋ฒ์ด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ด๋ค.
ํจํด์ ๋ฐ๊ฒฌํ ํ์๋ failure ํจ์๋ฅผ ๊ทธ๋๋ก ํ์ฉํ ์ ์์์ ๊นจ๋ฌ์๋ค.
๊ฐ๋ น ๋ฌธ์์ด : p a n a m a b a n a n a , ํจํด : a n a ๊ฐ ์๋ค๊ณ ํ ๋
p โ๏ธa n a m a b a n a n a
โ๏ธa n a
์ด๋ ๊ฒ begin 1 ์์ ์ด๋ฏธ ํจํด์ ๋ฐ๊ฒฌํด์ฃผ์์ด๋ ๋ฐ๋ก ๋ค์ ์ธ๋ฑ์ค์ธ n ์ ๊ฒ์ฌํ๋๊ฒ ์๋๋ผ (kmp์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์๊ฐํด๋ณด๋ฉด ์ ์ด์ a๋ก ์์ํ์ง๋ ์๋ ์ ๋ฅผ ๊ฒ์ฌํ ํ์๊ฐ ์๋ค) failure ํจ์๋ฅผ ์ฌ์ฉํด์ 3๋ฒ์งธ a๋ก ์์ํ๋ ๋ถ๋ถ๋ถํฐ ๊ฒ์ฌํ๋ฉด ๋๋ค. ํจํด ana ์ failure(2)=1 (โaโ) ์ด๋ฏ๋ก ๐
์ฝ๋ 1 ) input ๊ฐ ์ ์ฅํ๋ ๋ถ๋ถ
import sys
input=sys.stdin.readline
class Dinner:
def read(self):
self.move_n=int(input())
self.string=list(map(str,input().split()))
self.pattern=list(map(str,input().split()))
self.failure={}
self.count=0
์ฝ๋2) kmp ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ถ
def kmp(self):
self.Failure()
b=1
m=0
while b<=self.move_n:
if self.string[(b+m)%(self.move_n)]==self.pattern[m]:
m+=1
if m==len(self.pattern):
self.count+=1
try:
b=b+m-self.failure[m-1]
m=self.failure[m-1]
except KeyError:
b+=1
m=0
else:
#ํจํด๊ณผ ํ ๊ธ์๋ง ์ผ์นํ๊ฑฐ๋ ์์ ์ฒ์๋ถํฐ ๋ถ์ผ์นํ๋ ๊ฒฝ์ฐ
if m<=1:
b+=1
m=0
#ํน์ ๋ชจ๋ฅด๋๊น try๋ก
else:
try:
b=b+m-self.failure[m-1]
m=self.failure[m-1]
except KeyError:
b+=1
m=0
failure ํจ์๋ kmp ์๊ณ ๋ฆฌ์ฆ์ฒ๋ผ ๊ฐ์ด 0 ์ธ ์ ๋ค์ ์ ์ฅ ์ ํ๊ณ ๋ค ์คํตํ๊ธฐ ๋๋ฌธ์ ์ ์ด์ ๊ฐ์ด 0์ธ ์ ๋ค์ ์ ์ฅ๋์ด์์ง ์๋ค. ํ์ฉํ ์ ์์ผ๋ฏ๋ก ! ๊ทธ๋ฐ๋ฐ match ๊ฐ 0์ธ ๋ถ๋ถ๋ ํ์ฉํ ์ ์๋ failure ๋์ ๋๋ฆฌ์ ์ ๊ทผํด์ ์๋ฌ๊ฐ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ try ,except ๋ก ํด๊ฒฐํ์๋ค. ์ฆ except ์ ๊ฑธ๋ฆฌ๋ฉด failure ๋ก ๊ฒ์ฌ ์คํตํ์ง ๋ชปํ๋ ๋ถ๋ถ์ด๋๊น ๋น ์ง์์ด ๊ฒ์ฌํด๋ผ ! ๐ค ์ ์๋ฏธ์ด๋ค.
์ฌ์ค ์ฝ๋ ์ด๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ๊ฒ ๊ตฌํํ ์ ์์ ๊ฒ ๊ฐ๋ค. ๋ ์ข์ ๋ฐฉ๋ฒ ์์ผ๋ฉด ๊ณต์ ํด์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค ๐โโ๏ธ
์ฝ๋3) failure ํจ์ ๋ถ๋ถ
def Failure(self):
b=1
m=0
twin=self.pattern
while b+m<len(self.pattern):
if self.pattern[b+m]==twin[m]:
m+=1
self.failure[b+m-1]=m
else:
if m<=1:
b+=1
m=0
#ํน์ ๋ชจ๋ฅด๋๊น
else:
try:
b=b+m-self.failure[m-1]
m=self.failure[m-1]
except KeyError:
b+=1
m=0
failure ํจ์๋ ๊ฒฐ๊ตญ match ๊ฐ์ ์ด์ฉํ๋ kmp ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๊ฒ์ ์๊ฐํ๋ฉด ์ฝ๋๊ฐ while ๋ฌธ ์กฐ๊ฑด ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ ๋นผ๋ฉด ๊ฑฐ์ ์ ์ฌํ๋ค.
์ฝ๋4) gcd ๋ถ๋ถ
def gcd(self,x,y):
while y:
x,y=y,x%y
return x
์ฝ๋5)์ ๋ต ๋์ถ ๋ถ๋ถ
def Answer(self):
if self.pattern.count(self.pattern[0])==len(self.pattern):
print('1/1')
return
else:
self.kmp()
d=self.gcd(self.move_n,self.count)
Answer=str(self.count//d)+'/'+str((self.move_n)//d)
print(Answer)
์ ์ด์ ๋ฃฐ๋ ์ ๋ชจ๋ ๊ธ์๊ฐ ๋์ผํ๋ค๋ฉด ๋น์ฐํ ๋ฃฐ๋ ์ด ์ผ๋งํผ ํ์ ํด๋ 100% ๊ทธ ๋ฉ๋ด๋ฅผ ๋จน๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋จ์ถํ๋ ค๊ณ if ๋ฌธ์ ์ถ๊ฐํ์๋ค.
์ ์ฒด ์ฝ๋
import sys
input=sys.stdin.readline
class Dinner:
def read(self):
self.move_n=int(input())
self.string=list(map(str,input().split()))
self.pattern=list(map(str,input().split()))
self.failure={}
self.count=0
def kmp(self):
self.Failure()
b=1
m=0
#b๋ ์ปค์ง๊ณ m๋ ์ปค์ง๋ฏ๋ก ์ ํ์ ํด์ค์ผ ํจ, b๋ m ํ๋๋ผ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด while ์ข
๋ฃ
#begin ์ pattern ์ด string ๋ชจ๋ index๋ฅผ ๋๋ฉด์ ์ผ์น ๊ฐฏ์๋ฅผ ์ธ์ด์ผ ํจ
#pattern ์ค ์ผ๋ง๋ ์ผ์นํ๋์ง ๋ณด๋๊ฒ m์ด๊ธฐ ๋๋ฌธ์ m๋ pattern ๊ธธ์ด๋ฅผ ๋์ ์๊ฐ ์์
while b<=self.move_n:
if self.string[(b+m)%(self.move_n)]==self.pattern[m]:
m+=1
if m==len(self.pattern):
self.count+=1
try:
b=b+m-self.failure[m-1]
m=self.failure[m-1]
except KeyError:
b+=1
m=0
else:
#ํจํด๊ณผ ํ ๊ธ์๋ง ์ผ์นํ๊ฑฐ๋ ์์ ์ฒ์๋ถํฐ ๋ถ์ผ์นํ๋ ๊ฒฝ์ฐ
if m<=1:
b+=1
m=0
#ํน์ ๋ชจ๋ฅด๋๊น try๋ก
else:
try:
b=b+m-self.failure[m-1]
m=self.failure[m-1]
except KeyError:
b+=1
m=0
def Failure(self):
b=1
m=0
twin=self.pattern
while b+m<len(self.pattern):
if self.pattern[b+m]==twin[m]:
m+=1
self.failure[b+m-1]=m
else:
if m<=1:
b+=1
m=0
#ํน์ ๋ชจ๋ฅด๋๊น
else:
try:
b=b+m-self.failure[m-1]
m=self.failure[m-1]
except KeyError:
b+=1
m=0
def gcd(self,x,y):
while y:
x,y=y,x%y
return x
def Answer(self):
if self.pattern.count(self.pattern[0])==len(self.pattern):
print('1/1')
return
else:
self.kmp()
d=self.gcd(self.move_n,self.count)
Answer=str(self.count//d)+'/'+str((self.move_n)//d)
print(Answer)
dinner=Dinner()
dinner.read()
dinner.Answer()
ํด๋น ๋ฌธ์์ด ๋ด ์ธ๋ฑ์ค ํ๋ํ๋๋ฅผ ๊ฒ์ฌํด์ ํจํด์ด ์๋์ง๋ฅผ ์ฐพ๋๋ค๋ฉด ์ด์ค for ๋ฌธ์ ์จ์ผํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๊ฐ O(ํจํด ๊ธธ์ด*๋ฌธ์์ด ๊ธธ์ด) ๊ฐ ๋์จ๋ค. ๋ฐ๋ฉด kmp ์์๋ while ๋ฌธ ๊ฐ๊ฐ ํจํด ๊ธธ์ด,๋ฌธ์์ด ๊ธธ์ด๋ง ๊ณ ๋ คํด์ฃผ๋ฉด ๋๋ฏ๋ก O(ํจํด ๊ธธ์ด + ๋ฌธ์์ด ๊ธธ์ด) ์ด๋ค. ๐
๋ง๋ฌด์ผ๋ฆฌ
์ฌ์ค kmp ์๊ณ ๋ฆฌ์ฆ ์ด๋ ๊ฒ ๋ณต์กํ ๊ฑฐ๋ฅผ ๋ด๊ฐ ๋จ๋ฒ์ ๊ตฌํํ์๋ฆฌ๊ฐ ์๋ค ใ ใ ใ ๋น์ฐํ ์์ ์ kmp ์ฒ์ ๊ณต๋ถํ ๋ ๊ตฌ๊ธ๋ง๋ ํด๋ณด๊ณ ์ด๊ฒ์ ๊ฒ ๋จธ๋ฆฌ๋ฅผ ์ธ๋งค๊ณ ๋ง๋ ๋ถ๋ถ ๊บผ๋ด๋ค๊ฐ ๊ฑฐ์ ๋ฐ๊ฟ์ ์ผ๋ค. ์ต๋๊ณต์ฝ์๋ ๊ทธ๋ฅ ์ ์๋ ค์ง ์ฝ๋ ๊ณต์์ฒ๋ผ ์ธ์์ ์ฌ์ฉํ์๋ค ! ํ์ง๋ง ๋ฌธ์์ด ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์์ kmp ๊ฐ ๊ฑฐ์ ์นํธํค (๋ง๋?!) ๋ผ๊ณ ์๊ฐ์ด ๋ค์ด์ ์ด๋ ๊ฒ ์ต์ํด์ง๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค :)
์ฌ์ค ์ค๋ ์ด์งํ์ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ณต๋ถํ ์์์๋๋ฐ ์ ์ด์ ๋๋ฌด ๊ณต๋ถ๋ฅผ ๋ฆ๊ฒ ์์ํด์ ํ๋ฃจ ๋ฃจํด์ด ๋ง๊ฐ์ก๋ค. ๊ทธ๋์ ๋ฌธ์ ํ๋๋ผ๋ ํ๊ณ ์ฌ์๋ผ๋ ์๊ฐ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํ๊ฒ ๋์๋ค. bfs,dfs ๋ณต์ตํ๊ณ ์๋ถ๋ถ ์๊ณ ๋ฆฌ์ฆ ๋ณต์ตํ ๊ฒ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ํด์ผํ๋๋ฐ ์ค๋ ์ด๋ป๊ฒ ํ๋ค๋ณด๋๊น ๋ฌธ์์ด์ ํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋์ด ๋ฐฑ์ค 10๋ฌธ์ ํ์๋น ๐ ๊ทธ๋ฌ๋๊น ์ผ์์ผ์ ๋ญํ๊ณ ๋๊น ํํ
TMI
๋งฅ๋ถํฌ ํ๋ ค๋ค๊ฐ ๋ค๋ฅธ ์์ด์ฝ๋ค๋ก ์ฐ๋ถํฌ๋ฅผ ๊พธ๋ฉฐ๋ดค๋๋ฐ ์ข ์ ์นํ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค. ๋ถ๋ช ์ปดํจํฐ์ธ๋ฐ ์์ด์ฝ ์ด๋ ๊ฒ ํ๋๊น ํธ๋ํฐ ๋๋์ด ๋๋ค. ๋ฆฌ๋ ์ค ๊ณต๋ถํ๋ฉด ํ ์๋ก ๋งค๋ ฅ์๋ ๊ฒ ๊ฐ๋ค. ๋งฅย ยป๋ฆฌ๋ ์ค>์๋์ฐ ์์ผ๋ก ์ข๋ค. ์ด๊ฑฐ๋ ํ๊ธ ์ ๋ ฅ ํค๋งค๋๋ผ๊ณ ์ค์ ์๊ฐ์ ๋ค ๊น๋จน์์ง๋ง ๐ฃ ๋ฟ๋ฏํ๋น