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;
}