1
- #include < bits/stdc++.h>
1
+ #include < bits/stdc++.h>
2
+
2
3
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
+
24
5
const int N = 1e6 , NT = N + 2 ;
25
6
26
- int NieParzyste[NT], Parzyste[NT];
7
+ int Odd[NT], Even[NT];
8
+
27
9
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;
37
19
}
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;
47
30
}
48
- }
31
+ }
32
+ }
0 commit comments