Code

백준 1786

BIGFROG 2022. 2. 7. 21:16

def KMP(text,Pattern,Phi):
    count = 0
    pos = ""
    
    TextSize = len(text)
    PatternSize = len(Pattern)
    q = 0
    for i in range(0,TextSize):
        
        while q > 0 and Pattern[q] != text[i]: #* mismatch
            q = Phi[q-1]
            
        if Pattern[q] == text[i]:#* match
            
            if q == PatternSize -1:
                count += 1
                pos += str(i-PatternSize+1+1) + " "
                q = Phi[q]
            else:
                q += 1
    
    return count,pos
        
def PrefixFunc(P): #* Make Phi array
    m = len(P)
    phi = [0 for x in range(m)]
    phi[0] = 0
    k = 0
    for q in range(1,m):
        
        while k > 0 and P[k] != P[q]:
            k = phi[k-1]
        if P[k] == P[q]:
            k += 1
            phi[q] =k

    return phi

def main():

    data1 = input()
    data2 = input()

    T = list(data1)
    P = list(data2)

    phi = PrefixFunc(P)
    count = 0
    pos = None
    count,pos = KMP(T,P,phi)
    print(count)
    print(pos)


if __name__ == '__main__':
    main()

 

'Code' 카테고리의 다른 글

raw to bmp  (0) 2022.03.29
백준 4354  (0) 2022.02.07
[백준1978] 소수찾기  (0) 2020.01.09
[백준1193] 분수찾기  (0) 2020.01.09
[백준 2455] 지능형 기차  (0) 2020.01.09