zoukankan      html  css  js  c++  java
  • P3805 【模版】manacher算法

    题目描述

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

    字符串长度为n

    输入输出格式

    输入格式:

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

    输出格式:

    一个整数表示答案

    输入输出样例

    输入样例#1:
    aaa
    输出样例#1:
    3

    说明

    字符串长度len <= 11000000

    老吕教的manacher太low,,

    写一个T一个,

    以后改写位运算型的了。

    一个点才300ms

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<queue>
     6 #include<algorithm>
     7 #include<cstdlib>
     8 #define lli long long int 
     9 using namespace std;
    10 const lli MAXN=31000011;
    11 char s[MAXN];
    12 char str[MAXN];
    13 int ans[MAXN];
    14 int len=0;
    15 int ls=0;
    16 void getstr()
    17 {
    18     str[0]='#';
    19     str[1]='#';
    20     for(int i=0;i<ls;i++)
    21     str[(i<<1)+2]=s[i],str[(i<<1)+3]='#';
    22     ls=(ls<<1)+2;
    23     str[ls]=0;
    24 }
    25 void manacher()
    26 {
    27     getstr();
    28     int mx=0,id=0;
    29     
    30     len=strlen(str);
    31     for(int i=1;i<len;i++)
    32     {
    33         if(mx>i)
    34             ans[i]=min(ans[2*id-i],mx-i);
    35         else ans[i]=1;
    36         while(str[i+ans[i]]==str[i-ans[i]])
    37             ++ans[i];
    38         if(i+ans[i]>mx)
    39             mx=i+ans[i],id=i;
    40             
    41     }
    42 }
    43 int main()
    44 {
    45     scanf("%s",s);
    46     ls=strlen(s);
    47     manacher();
    48     int out=0;
    49     for(int i=0;i<len;i++)
    50         out=max(out,ans[i]);
    51     printf("%d",out-1);
    52     return 0;
    53 }
  • 相关阅读:
    (转)sql server 生成树形菜单
    在Sublime Text 3中配置Python3的开发环境/Build System
    按回车键提交表单 问题
    多页面 返回 到同一页面
    sql 查找出表里所有字段
    sql 创建表变量,临时表
    sql语句中数据类型转换函数:CAST 和 Convert
    sql isnull函数
    判断值是否为整数
    TSQL游标使用
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7128292.html
Copyright © 2011-2022 走看看