Z 응용 문제.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<ll, ll, ll> tll;
const int MAXN = 100001;
int N, K;
string S;
int Z[MAXN];
bool solve(int idx, int len)
{
if(Z[idx] <= len && idx+Z[idx] == N)
{
if(len-Z[idx] <= K) return true; //K개의 글자로 패턴의 길이를 만들 수 있으면 true return
else return false;
}
if(Z[idx] >= len) return solve(idx+len, len); //Z 배열이 등차수열을 이뤄야 한다.
return false;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> N >> K;
cin >> S;
int l = 0, r = 0;
for(int i=1; i<N; i++)
{
Z[i] = (i > r) ? 0 : min(r-i+1, Z[i-l]);
while(i+Z[i] < N && S[Z[i]] == S[i+Z[i]]) Z[i]++;
if(i+Z[i]-1 > r) l = i, r = i+Z[i]-1;
}
int ans = 0;
if(N <= K) ans = N;
else
{
for(int i=1; i<N; i++)
if(solve(i, i)) ans = i;
}
cout << ans;
}
3955번: 캔디 분배 - 수학(확장 유클리드 호제법) (0) | 2024.07.21 |
---|---|
11402번: 이항 계수 4 - 수학(뤼카의 정리) (0) | 2024.07.21 |
13713번: 문자열과 쿼리 - Z (2) | 2024.07.20 |
10070번: 벽 - 세그먼트 트리(lazy) (0) | 2024.07.20 |
13925번: 수열과 쿼리 13 - 세그먼트 트리(lazy) (1) | 2024.07.20 |
댓글 영역