#include <bits/stdc++.h>
#include "message.h"
#include "palindromy.h"
using namespace std;
vector<int> tab;
char literka(long long x) {
static int n = GetLength();
if (x % 2) {
if (x / 2 < n)
return GetLetter(x / 2);
return '#';
}
return '$';
}
long long wynik = 0;
void dodaj(int x) {
if (x % 2) wynik += tab[x] / 2 + 1;
else wynik += tab[x] / 2;
}
int main()
{
if (MyNodeId() == 0) {
int n = GetLength();
tab.resize(2*n);
int k = 0;
// printf("%s\n",slo);
for (int i=0;i<2*n;)
{
while(k < i && literka(i-k-1) == literka(i+k+1)) k++;
tab[i] = k;
dodaj(i);
if ( k == 0 ){
i++;
continue;
}
for (int j=1;;j++)
{
if ( j == k || tab[i-j]+i+j >= i+k )
{
k -= j;
i += j;
break;
}
tab[i+j] = tab[i-j];
dodaj(i + j);
}
}
printf("%lld\n", wynik);
}
}
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 | #include <bits/stdc++.h> #include "message.h" #include "palindromy.h" using namespace std; vector<int> tab; char literka(long long x) { static int n = GetLength(); if (x % 2) { if (x / 2 < n) return GetLetter(x / 2); return '#'; } return '$'; } long long wynik = 0; void dodaj(int x) { if (x % 2) wynik += tab[x] / 2 + 1; else wynik += tab[x] / 2; } int main() { if (MyNodeId() == 0) { int n = GetLength(); tab.resize(2*n); int k = 0; // printf("%s\n",slo); for (int i=0;i<2*n;) { while(k < i && literka(i-k-1) == literka(i+k+1)) k++; tab[i] = k; dodaj(i); if ( k == 0 ){ i++; continue; } for (int j=1;;j++) { if ( j == k || tab[i-j]+i+j >= i+k ) { k -= j; i += j; break; } tab[i+j] = tab[i-j]; dodaj(i + j); } } printf("%lld\n", wynik); } } |
English