16163번: manacher 기본 문제.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> tiii;
const int SIZE = 4000010;
string S = "$";
int m = -1, k;
int rad[SIZE];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
string str; cin >> str;
for(char c : str) S += c, S += '$';
ll ans = 0;
for(int i=0; i<S.size(); i++)
{
if(i <= m) rad[i] = min(m-i, rad[2*k-i]);
//l = i-rad[i]-1, r = i+rad[i]+1라고 생각하면 편하다. 팰린드롬의 길이를 늘려가며 최대 반지름 길이를 구한다.
while(0 <= i-rad[i]-1 && i+rad[i]+1 <= S.size() && S[i-rad[i]-1] == S[i+rad[i]+1])
if(++rad[i] > m-i) m = i+rad[i], k = i;
ans += (rad[i]+1)/2;
}
cout << ans;
}
13275번: manacher 기본 문제.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> tiii;
const int SIZE = 4000010;
string S = "$";
int m = -1, k;
int rad[SIZE];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
string str; cin >> str;
for(char c : str) S += c, S += '$';
int ans = 0;
for(int i=0; i<S.size(); i++)
{
if(i <= m) rad[i] = min(m-i, rad[2*k-i]);
while(0 <= i-rad[i]-1 && i+rad[i]+1 <= S.size() && S[i-rad[i]-1] == S[i+rad[i]+1])
if(++rad[i] > m-i) m = i+rad[i], k = i;
ans = max(ans, rad[i]);
}
cout << ans;
}
10999번: 구간 합 구하기 2 - 세그먼트 트리(lazy) (0) | 2024.07.07 |
---|---|
2820번: 자동차 공장 - 세그먼트 트리(오일러 경로 테크닉) (0) | 2024.07.07 |
11111번: 두부장수 장홍준 2 - 최대 유량(MCMF) (0) | 2024.07.07 |
11493번: 동전 교환 - 최대 유량(MCMF) (0) | 2024.07.07 |
11408번: 열혈강호 5, 11409번: 열혈강호 6 - 최대 유량(MCMF) (0) | 2024.07.06 |
댓글 영역