• 链接
  • 板子
    • p[i]记录从下标i开始最多能拓展的回文半径
    • 因为我们插入了字符’#’,所以p[i]-1是实际整个回文串的长度
    • 而p[i]/2是实际的半径
    • #include<bits/stdc++.h>
      using namespace std;
      const int N=11000000+5;
      const int inf=2147483647;
      
      int cnt, len, ans = 0;
      char s[N], ss[N*2];
      int p[N*2];
      
      void init(){//将每两个字符中插入一个字符
          len = strlen(s), cnt = 1;
          ss[0] = '!'; ss[cnt] = '#';
          for(int i=0;i<len;i++)
          ss[++cnt] = s[i], ss[++cnt] = '#';
      }
      
      void manacher(){
          int pos = 0, mx = 0;
          for(int i=1;i<=cnt;i++){
              if(i < mx) p[i] = min(p[pos*2-i],mx-i);
              else p[i] = 1;
              while(ss[i+p[i]] == ss[i-p[i]]) p[i]++;
              if(mx < i+p[i]) mx = i+p[i], pos = i;
              ans = max(ans,p[i]-1);
          }
      }
      
      int main(){
          scanf("%s",s);
          init(); manacher();
          printf("%d\n",ans);
          return 0;
      }

发表评论

邮箱地址不会被公开。 必填项已用*标注