백준 5525번: IOIO/kmp/while

Jimin·2022년 7월 25일
0

알고리즘

목록 보기
24/71
for(int i=0;i<N-M+1;i++){
   int tmp = 0;
   for(int j=0;j<M;j++){
       if(x[i+j] != y[j]){
          tmp=1;
       }
   if(tmp == 0){
     // 포함된 상태
    }
}

첫 번째 내 코드는 50점만 나왔다.

답은 나오는데 시간 초과 나옴

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <string>
#include <set>
using namespace std;

long long N, M;
string S;
string IO;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N; // O와 I의 개수
    cin >> M; // 문자열 S의 길이
    cin >> S;
    string tmp = "IO";
    while (N--) {
        IO += tmp;
    }
    IO += "I";
    int lenIO =IO.length();
    int cnt = 0;
    for (int i = 0; i < M-lenIO + 1; i ++) {
        int flag = 0;
        for (int j = 0; j < lenIO; j++) {
            if (S[i + j] != IO[j]) {
                flag = 1;
                break;
            }
        }
        if (flag == 0) {
            cnt++;
        }
    }
    cout << cnt;
    return 0;
}

version1-1 (그냥 while만 이용한 코드)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <string>
#include <set>
using namespace std;
const int N_MAX = 1000001;
const int M_MAX = 1000001;

long long N, M;
string S;
string IO;

int cnt = 0;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N; // O와 I의 개수
    cin >> M; // 문자열 S의 길이
    cin >> S;
    
    for (int i = 0; i < M; i++) {
        int t = 0;
        if (S[i] == 'O')continue;
        while (S[i + 1] == 'O' && S[i + 2] == 'I') {
            t++;
            if (t == N) {
                cnt++;
                t--; // 중복 방지
            }
            i += 2;
        }
    }
    cout << cnt;
    return 0;
}

version-2 kmp 알고리즘

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


vector<int> Fail(string pattern) {
	int m = pattern.length();
	vector<int> pi(m); // 모든 원소가 0으로 초기화된 상태에서 시작한다.
	pi[0] = 0;
	for (int i = 1, j = 0; i < m; i++) {
		while (j > 0 && pattern[i] != pattern[j]) {
			j = pi[j - 1];
		}
		if (pattern[i] == pattern[j]) {
			pi[i] = ++j;
		}
	}
	return pi;
}

vector<int> KMP(string pattern, string text) {
	int m = pattern.length();
	int n = pattern.length();
	vector<int> pos;
	vector<int> pi = Fail(pattern);

	for (int i = 0, j = 0; i < n; i++) {
		while (j > 0 && text[i] != pattern[j]) {
			j = pi[j - 1];
		}
		if (text[i] == pattern[j]) {
			if (j == m - 1) {
				pos.push_back(i - m + 1);
				j = pi[j];
			}
			else {
				j++;
			}
		}
	}
	return pos;
}
profile
https://github.com/Dingadung

0개의 댓글