Manacher

xiaoxiao2025-05-25  24

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1000005; char s[maxn]; char ma[maxn * 2]; int mp[maxn * 2]; void Manacher(char s[]) {     int len = strlen(s);     int l = 0;     ma[l++] = '$';     ma[l++] = '#';     for(int i = 0;i < len;i++)     {         ma[l++] = s[i];         ma[l++] = '#';     }     ma[l] = 0;     int mx = 0,id = 0;     for(int i = 0;i <= l;i++)     {         mp[i] = mx > i?min(mp[2*id-i],mx - i):1;         while(ma[i+mp[i]] == ma[i-mp[i]]) mp[i]++;         if(i + mp[i] > mx)         {             mx = i + mp[i];             id = i;         }     } } int main() {     int cnt = 0;     while(scanf("%s", s) != EOF)     {         if(strcmp(s,"END") == 0) break;         int len = strlen(s);         Manacher(s);         int ans = 0;         for(int i = 0;i <= len*2+2;i++)         {             ans = max(ans,mp[i]);         }         printf("Case %d: ",++cnt);         printf("%d\n",ans-1);     }     return 0; }

转载请注明原文地址: https://www.6miu.com/read-5030660.html

最新回复(0)