\(\text{Code}\)
| #include<cstdio> |
| #include<cstring> |
| #include<iostream> |
| #define LL long long |
| #define re register |
| using namespace std; |
| |
| const int N = 3e5 + 5; |
| char str[N]; |
| |
| struct PAM{ |
| int size, last, tot, tr[N][26], cnt[N], fail[N], len[N]; |
| char s[N]; |
| inline int Node(int l) |
| { |
| ++size; |
| for(re int i = 0; i < 26; i++) tr[size][i] = 0; |
| len[size] = l, fail[size] = cnt[size] = 0; |
| return size; |
| } |
| inline void clear() |
| { |
| size = -1, s[last = tot = 0] = '$'; |
| Node(0), Node(-1), fail[0] = 1; |
| } |
| inline int getfail(int x) |
| { |
| while (s[tot - len[x] - 1] != s[tot]) x = fail[x]; |
| return x; |
| } |
| inline void insert(int x) |
| { |
| s[++tot] = str[x]; |
| int u = getfail(last), ch = str[x] - 'a'; |
| if (!tr[u][ch]) |
| { |
| int v = Node(len[u] + 2); |
| fail[v] = tr[getfail(fail[u])][ch], tr[u][ch] = v; |
| } |
| ++cnt[last = tr[u][ch]]; |
| } |
| inline LL query() |
| { |
| for(re int i = size; i >= 0; i--) cnt[fail[i]] += cnt[i]; |
| LL ans = 0; |
| for(re int i = 1; i <= size; i++) ans = max(ans, 1LL * cnt[i] * len[i]); |
| return ans; |
| } |
| }P; |
| |
| int main() |
| { |
| P.clear(); |
| scanf("%s", str); |
| int len = strlen(str); |
| for(re int i = 0; i < len; i++) P.insert(i); |
| printf("%lld\n", P.query()); |
| } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步