알고리즘/백준
[cpp 알고리즘] 백준 11046 팰린드롬??
sum_mit45
2023. 5. 17. 11:56
728x90
반응형
[백준] 11046 팰린드롬?? cpp 풀이
매내처, manacher's, 문자열
문제출처:
https://www.acmicpc.net/problem/11046
11046번: 팰린드롬??
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
문제 요약
- 자연수 N개(1<=N<=1,000,000)가 주어지고, 총 M번(1<=M<=1,000,000)의 테스트케이스에서 S번쨰 수부터 E번쨰 수가 팰린드롬인지 확인하는 문제이다. 각각의 테스트케이스에 대해 팰린드롬이면 1을, 아니면 0을 출력하면 된다.
- 팰린드롬 : 양쪽이 대칭이 되는 문자열 ex) a, aa, abcba
- 백준 10942 팰린드롬? 과 같은 문제인데, N의 크기가 다르다는 것이 차이.
2023.05.06 - [알고리즘/백준] - [C++ 알고리즘] 백준 10942 팰린드롬?
[C++ 알고리즘] 백준 10942 팰린드롬?
[백준] 10942 팰린드롬? C++ 풀이 DP, 다이나믹 프로그래밍 문제 출처: https://www.acmicpc.net/problem/10942 10942번: 팰린드롬? 총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에
sum-mit45.tistory.com
풀이 정리
1. 매내처 알고리즘 활용
C++ 코드
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int N,M; //수열의 크기, M번 반복
int arr[2000001];
int A[2000001];
void manachers(){
int r=0, p=0;
for(int i=0; i<N; i++){
if(i<=r) A[i] = min(A[2*p-i], r-i);
else A[i] = 0;
while(i-A[i]-1 >=0 && i+A[i]+1 <= N-1 && arr[i-A[i]-1] == arr[i+A[i]+1])
A[i]++;
if(r<i+A[i]){
r=i+A[i];
p=i;
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N;
for(int i=0; i<N; i++) {
arr[i*2]=0; //짝수 팰린드롬 위해서
cin >> arr[i*2+1];
}
N=N*2+1; //짝수 팰린드롬 위해서 0을 넣었으니, N의값을 글자수*2+1로 해줌
arr[N-1]=0; //짝수 팰린드롬 위해서
manachers();
cin >> M;
while(M>0){
int s,e; cin >> s >> e;
s--; e--;
if (A[s+e+1] >= e-s+1) cout << 1 << "\n";
else cout << 0 << "\n";
M--;
}
return 0;
}
728x90
반응형