[ BOJ / C++ ] 16916번 부분 문자열

황승환·2021년 7월 19일
0

C++

목록 보기
15/65

이번 문제는 KMP 알고리즘을 활용하는 문제였다. 본인은 KMP 알고리즘을 처음 접해봤기 때문에 찾아보면서 해결했다.
KMP 알고리즘

Code

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;

string s;
string p;
vector<int> pi;

void Input(){
    cin>>s;
    cin>>p;
}

void getPi(string a){
    int m=a.size();
    int j=0;
    pi.resize(m, 0);
    for(int i=1; i<m; i++){
        while((j>0)&&a[i]!=a[j]){
            j=pi[j-1];
        }
        if(a[i]==a[j]){
            j++;
            pi[i]=j;
        }
    }
}

bool KMP(string s, string p){
    int i=0;
    int j=0;
    
    for(int i=0; i<s.size(); i++){
        while((j>0)&&(s[i]!=p[j])){
            j=pi[j-1];
        }
        if(s[i]==p[j]){
            if(j==p.size()-1){
                return true;
                break;
            }
            else
                j++;
        }
    }
    return false;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    Input();
    getPi(s);
    cout<<KMP(s,p)<<endl;
    return 0;
}

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글