Pagini recente » Cod sursa (job #1077076) | Cod sursa (job #173718) | Cod sursa (job #1027718) | Cod sursa (job #2057524) | Cod sursa (job #3290280)
#include <fstream>
#include <vector>
#include <string>
using namespace std;
// Funcție care transformă șirul inițial prin inserarea caracterului '#'
string transform(const string& s) {
string t = "#";
for (char c : s) {
t += c;
t += "#";
}
return t;
}
// Funcție care aplică algoritmul lui Manacher și calculează numărul total de subsecvențe palindromice
long long manacher(const string& s) {
string t = transform(s);
int n = t.size();
vector<int> P(n, 0);
int C = 0, R = 0;
long long totalPalindromes = 0;
for (int i = 0; i < n; i++) {
int mirror = 2 * C - i;
if (i < R)
P[i] = min(R - i, P[mirror]);
// Extindem palindromul centrat la i
while (i - P[i] - 1 >= 0 && i + P[i] + 1 < n && t[i - P[i] - 1] == t[i + P[i] + 1])
P[i]++;
// Actualizăm centrul și marginea dreaptă
if (i + P[i] > R) {
C = i;
R = i + P[i];
}
// Adăugăm numărul de palindroame centrate la i
totalPalindromes += (P[i] + 1) / 2;
}
return totalPalindromes;
}
int main() {
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
string s;
fin >> s;
long long result = manacher(s);
fout << result << endl;
fin.close();
fout.close();
return 0;
}