zoukankan      html  css  js  c++  java
  • 【模板】Manacher(洛谷P3805)

    Description

      给出一个只由小写英文字符(a,b,c...y,z)组成的字符串(S),求(S)中最长回文串的长度.字符串长度为(n)

    Input

      一行小写英文字符(a,b,c...y,z)组成的字符串(S)

    Output

      一个整数表示答案

    Solution

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    char ch[11000010],s[22000010];
    int len[22000010],pos,last;
    int main()
    {
        scanf("%s",ch+1);
        int l=strlen(ch+1);
        s[0]='$';
        for (int i=1;i<=l;i++)
        {
            s[2*i-1]='#';
            s[2*i]=ch[i];
        }
        s[2*l+1]='#',s[2*l+2]='@';
        l=2*l+2;
        for (int i=1;i<l;i++)
        {
            if (last>=i) len[i]=min(last-i,len[2*pos-i]);
            while (s[i-len[i]-1]==s[i+len[i]+1]) len[i]++;
            if (i+len[i]>last)
            {
                last=i+len[i];
                pos=i;
            }
        }
        int ans=0;
        for (int i=1;i<l;i++) ans=max(ans,len[i]);
        printf("%d
    ",ans);
        return 0;
    }
    
    
  • 相关阅读:
    C#-------------枚举
    C#-------------类型构造器
    C#-内存天下
    线程在C#中的使用
    C#遗忘笔记--品味类型
    二分查找算法(C#实现)
    Linq 表达式树
    javascript中的对象
    this绑定的顺序
    弹出对话框
  • 原文地址:https://www.cnblogs.com/Code-Geass/p/9917352.html
Copyright © 2011-2022 走看看