#include "palindromy.h"
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
// zrodlo: was.zaa.mimuw.edu.pl
//Palindromy parzyste
vector<int> Manacher1(string s)
{
string x("$"); x += s; x += '#';
vector<int> R;
R.push_back(0);
int i = 1, j = 0;
while (i <= x.size() - 1)
{
while (x[i - j] == x[i + j + 1])
j++;
R.push_back(j);
int k = 1;
while (R[i - k] != R[i] - k && k <= j)
{
R.push_back(min(R[i - k], R[i] - k));
k++;
}
j=max(j - k, 0); i += k;
}
return R;
}
//Palindromy nieparzyste
vector<int> Manacher2(string s)
{
string x("$"); x += s; x += '#';
vector<int> R;
R.push_back(0);
int i = 1, j = 0;
while (i <= x.size() - 1)
{
while (x[i - j - 1] == x[i + j + 1])
j++;
R.push_back(j);
int k = 1;
while (R[i - k] != R[i] - k && k <= j)
{
R.push_back(min(R[i - k], R[i] - k));
k++;
}
j=max(j - k, 0); i += k;
}
return R;
}
int main()
{
if (MyNodeId() != 0) return 0;
long long N = GetLength();
string s;
for (long long i = 0; i < N; ++ i)
s += GetLetter(i);
vector<int> g = Manacher1(s), h = Manacher2(s);
long long res = 0;
for(int i = 0; i < g.size(); ++ i)
res += g[i];
for(int i = 0; i < h.size(); ++ i)
res += h[i];
cout << res +s.size() << "\n";
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include "palindromy.h" #include "message.h" #include <bits/stdc++.h> using namespace std; // zrodlo: was.zaa.mimuw.edu.pl //Palindromy parzyste vector<int> Manacher1(string s) { string x("$"); x += s; x += '#'; vector<int> R; R.push_back(0); int i = 1, j = 0; while (i <= x.size() - 1) { while (x[i - j] == x[i + j + 1]) j++; R.push_back(j); int k = 1; while (R[i - k] != R[i] - k && k <= j) { R.push_back(min(R[i - k], R[i] - k)); k++; } j=max(j - k, 0); i += k; } return R; } //Palindromy nieparzyste vector<int> Manacher2(string s) { string x("$"); x += s; x += '#'; vector<int> R; R.push_back(0); int i = 1, j = 0; while (i <= x.size() - 1) { while (x[i - j - 1] == x[i + j + 1]) j++; R.push_back(j); int k = 1; while (R[i - k] != R[i] - k && k <= j) { R.push_back(min(R[i - k], R[i] - k)); k++; } j=max(j - k, 0); i += k; } return R; } int main() { if (MyNodeId() != 0) return 0; long long N = GetLength(); string s; for (long long i = 0; i < N; ++ i) s += GetLetter(i); vector<int> g = Manacher1(s), h = Manacher2(s); long long res = 0; for(int i = 0; i < g.size(); ++ i) res += g[i]; for(int i = 0; i < h.size(); ++ i) res += h[i]; cout << res +s.size() << "\n"; return 0; } |
English