From 66a598e3b29ac830cdbaa46802a6131e9733e38f Mon Sep 17 00:00:00 2001 From: Aj12345616 <68468062+Aj12345616@users.noreply.github.com> Date: Sat, 3 Oct 2020 23:40:33 +0530 Subject: [PATCH] PalindromeTree.cpp PalindromeTree.cpp by akshat jain --- Palindromic-Tree/PalindromeTree.cpp | 84 +++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 Palindromic-Tree/PalindromeTree.cpp diff --git a/Palindromic-Tree/PalindromeTree.cpp b/Palindromic-Tree/PalindromeTree.cpp new file mode 100644 index 0000000..5b1b526 --- /dev/null +++ b/Palindromic-Tree/PalindromeTree.cpp @@ -0,0 +1,84 @@ +#include +#include + +using namespace std; + +const int MAXN = 105000; + +struct node { + int next[26]; + int len; + int a; + int num; +}; + +int len; +char s[MAXN]; +node tree[MAXN]; +int num; +int b; +long long ans; + +bool addLetter(int pos) { + int cur = b, curlen = 0; + int let = s[pos] - 'a'; + + while (true) { + curlen = tree[cur].len; + if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) + break; + cur = tree[cur].a; + } + if (tree[cur].next[let]) { + b = tree[cur].next[let]; + return false; + } + + num++; + b = num; + tree[num].len = tree[cur].len + 2; + tree[cur].next[let] = num; + + if (tree[num].len == 1) { + tree[num].a = 2; + tree[num].num = 1; + return true; + } + + while (true) { + cur = tree[cur].a; + curlen = tree[cur].len; + if (pos - 1 - curlen >= 0 && s[pos - 1 - curlen] == s[pos]) { + tree[num].a = tree[cur].next[let]; + break; + } + } + + tree[num].num = 1 + tree[tree[num].a].num; + + return true; +} + +void initTree() { + num = 2; b = 2; + tree[1].len = -1; tree[1].a = 1; + tree[2].len = 0; tree[2].a = 1; +} + +int main() { + + + gets(s); + len = strlen(s); + + initTree(); + + for (int i = 0; i < len; i++) { + addLetter(i); + ans += tree[b].num; + } + + cout << ans << endl; + + return 0; +}