Skip to content

Commit 13769a0

Browse files
committed
Solve Manacher
1 parent fca37d7 commit 13769a0

File tree

1 file changed

+26
-42
lines changed

1 file changed

+26
-42
lines changed

Manacher.cpp

+26-42
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,32 @@
1-
#include<bits/stdc++.h>
1+
#include <bits/stdc++.h>
2+
23
using namespace std;
3-
#define FOR(i,a,b) for(int i = (a); i <= (b); ++i)
4-
#define FORD(i,a,b) for(int i = (b); i >= (a); --i)
5-
#define TRAV(x,T) for(auto& x: (T))
6-
#define ALL(T) T.begin(), T.end()
7-
#define TAB(T,a,b) (T)+a, (T)+((b)+1)
8-
#define VAR(x) #x<<" = "<<x<<" "
9-
#define SZ(x) (int)(x).size()
10-
#define Nwd __gcd
11-
#define pb push_back
12-
#define st first
13-
#define nd second
14-
#define lc (v<<1)
15-
#define rc (v<<1|1)
16-
typedef long long ll;
17-
typedef long double ld;
18-
typedef pair<int, int> pii;
19-
typedef pair<int, ll> pil;
20-
typedef pair<ll, int> pli;
21-
typedef pair<ll, ll> pll;
22-
typedef vector<int> vi;
23-
#define deb if(0)
4+
245
const int N = 1e6, NT = N + 2;
256

26-
int NieParzyste[NT], Parzyste[NT];
7+
int Odd[NT], Even[NT];
8+
279
void Manacher(string s) {
28-
int n = SZ(s), k, l = 0, r = -1;
29-
FOR(i, 0, n-1) {
30-
k = (i > r) ? 1: min(NieParzyste[l + r - i + 1], r - i + 1);
31-
while (0 <= i - k and i + k < n and s[i - k] == s[i + k]) k++;
32-
NieParzyste[i + 1] = k--;
33-
if (i + k > r) {
34-
l = i - k;
35-
r = i + k;
36-
}
10+
int n = s.size(), k, l = 0, r = -1;
11+
for (int i = 0; i <= n - 1; i++) {
12+
k = (i > r) ? 1 : min(Odd[l + r - i + 1], r - i + 1);
13+
while (0 <= i - k and i + k < n and s[i - k] == s[i + k])
14+
k++;
15+
Odd[i + 1] = k--;
16+
if (i + k > r) {
17+
l = i - k;
18+
r = i + k;
3719
}
38-
l = 0, r = -1;
39-
FOR(i, 0, n-1) {
40-
k = (i > r) ? 0: min(Parzyste[l + r - i + 2], r - i + 1);
41-
while (0 <= i - k - 1 and i + k < n and s[i - k - 1] == s[i + k])k++;
42-
Parzyste[i + 1] = k--;
43-
if (i + k > r) {
44-
l = i - k - 1;
45-
r = i + k ;
46-
}
20+
}
21+
l = 0, r = -1;
22+
for (int i = 0; i <= n - 1; i++) {
23+
k = (i > r) ? 0 : min(Even[l + r - i + 2], r - i + 1);
24+
while (0 <= i - k - 1 and i + k < n and s[i - k - 1] == s[i + k])
25+
k++;
26+
Even[i + 1] = k--;
27+
if (i + k > r) {
28+
l = i - k - 1;
29+
r = i + k;
4730
}
48-
}
31+
}
32+
}

0 commit comments

Comments
 (0)