3676: [Apio2014]回文串


Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 3396  Solved: 1568
[Submit][Status][Discuss]

Description


考虑一个只包含小写拉丁字母的字符串s。我们定义s的一个子串t的“出 
现值”为t在s中的出现次数乘以t的长度。请你求出s的所有回文子串中的最 
大出现值。

Input


输入只有一行,为一个只包含小写字母(a -z)的非空字符串s。

Output


输出一个整数,为逝查回文子串的最大出现值。

Sample Input


【样例输入l】

abacaba 

【样例输入2]

www 

Sample Output


【样例输出l】

 

【样例输出2]

 

HINT


一个串是回文的,当且仅当它从左到右读和从右到左读完全一样。

在第一个样例中,回文子串有7个:a,b,c,aba,aca,bacab,abacaba,其中:

● a出现4次,其出现值为4:1:1=4

● b出现2次,其出现值为2:1:1=2

● c出现1次,其出现值为l:1:l=l

● aba出现2次,其出现值为2:1:3=6

● aca出现1次,其出现值为1=1:3=3

●bacab出现1次,其出现值为1:1:5=5

● abacaba出现1次,其出现值为1:1:7=7

故最大回文子串出现值为7。

【数据规模与评分】

数据满足1≤字符串长度≤300000。

分析:


回文树眼题,但是我不会回文树QAQ

于是后缀自动机加manacher,构造出后缀自动机parent树后倍增每个点2^i能到达的点的dis值。
然后就可以做了。。。

AC代码:


# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
;
long long ans;
][];
],fa[N << ],w[N << ],cnt = ,len;
],p[N << ],dt,Log[],g[N << ][],Id[N];
];
int Sam(int c,int last)
{
    int u = last,cur;
    ]] = u,u = fa[u];
    if(!u)
    {
        cur = ++cnt;fa[cur] = ;
        ])ch[que[que[]--]][c] = cur;
    }
    else
    {
        int v = ch[u][c];
        )
        {
            cur = ++cnt;fa[cur] = v;
            ])ch[que[que[]--]][c] = cur;
        }
        else
        {
            ;cur = ++cnt;
            ])ch[que[que[]--]][c] = cur;
            memcpy(ch[av],ch[v],sizeof ch[v]);
            fa[av] = fa[v];fa[v] = fa[cur] = av;
            while(u && ch[u][c] == v)ch[u][c] = av,u = fa[u];
        }
    }
    dis[cur] = dis[last] + ;
    return cur;
}
void Manacher()
{
  s[] = ] = '#';
  ;i <= len;i++)s[++dt] = str[i],s[++dt] = '#';
  ,id = ;p[] = p[] = ;
  ;i < dt;i++)
  {
      p[i] = min(p[ * id - i],mx - i);
      ] == s[i - p[i] - ])
    {
     p[i]++;
     )
     {
         ) >> ],L = ((i + p[i] - ) >> ) - ((i - p[i] + ) >> ) + ;
         ;~j;j--)if(dis[g[now][j]] >= L)now = g[now][j];
         ans = max(ans,1LL * L * w[now]);
     }
    }
      if(i + p[i] > mx)
      {
          id = i;
          mx = i + p[i];
      }
  }
}
void init()
{
    Log[] = ;;i < ;i++)Log[i] = Log[i - ] << ;
    ;i <= cnt;i++)g[i][] = fa[i];//这里考场上写成了<=len,结果得了90
    ;j <= ;j++)
     ;i <= cnt;i++)
     g[i][j] = g[g[i][j - ]][j - ];
}
int main()
{
    scanf();len = strlen(str + );Id[] = ;
    ;i <= len;i++)Id[i] = Sam(str[i] - ]),w[Id[i]]++;
    ;i <= cnt;i++)p[dis[i]]++;
    ;i <= len;i++)p[i] += p[i - ];
    ;i--)que[p[dis[i]]--] = i;
    ;i--)w[fa[que[i]]] += w[que[i]];
    init();Manacher();
    printf("%lld\n",ans);
    ;
}

[Bzoj3676][Apio2014]回文串(后缀自动机)(parent树)(倍增)的更多相关文章

  1. bzoj3676 [Apio2014]回文串 卡常+SAM+树上倍增

    bzoj3676 [Apio2014]回文串 SAM+树上倍增 链接 bzoj luogu 思路 根据manacher可以知道,每次暴力扩展才有可能出现新的回文串. 所以推出本质不同的回文串个数是O( ...

  2. BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)

    题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...

  3. BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增

    http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ...

  4. [APIO2014]回文串 后缀自动机_Manancher_倍增

    Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #include <cstr ...

  5. [模板] 回文树/回文自动机 &amp;&amp; BZOJ3676:[Apio2014]回文串

    回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...

  6. [BZOJ3676][APIO2014]回文串(Manacher+SAM)

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 3097  Solved: 1408[Submit][Statu ...

  7. BZOJ3676 APIO2014回文串(manacher+后缀自动机)

    由于本质不同的回文子串数量是O(n)的,考虑在对于每个回文子串在第一次找到它时对其暴力统计.可以发现manacher时若右端点移动则找到了一个新回文串.注意这样会漏掉串长为1的情况,特判一下. 现在问 ...

  8. 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)

    传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l, ...

  9. [bzoj3676][Apio2014]回文串——Manacher+后缀自动机+倍增

    Brief Description 一个回文串的value定义为这个回文串的长度乘以出现次数.给定一个字符串,求\(value_{max}\). Algorithm Design 我们使用Manach ...

随机推荐

  1. java对xml节点属性的增删改查

    学习本文之前请先看我的另一篇文章JAVA对XML节点的操作可以对XML操作有更好的了解. package vastsum; import java.io.File; import java.io.Fi ...

  2. [No00009A]JsonToObject json与类互转

    using System.Web.Script.Serialization; /// <summary> /// 内部类,保存jsonData /// </summary> p ...

  3. LaTex随笔

    最近简单接触了LaTex排版,留下一些笔记供日后参考. 1.基本格式 \documentclass{article}\title{……}\begin{document}\maketitle\secti ...

  4. C#相关时间DateTime格式化

    C#代码中时间转换为2016-01-24 12:12:12需要如下操作: DateTime.Parse(sj).ToString("yyyy-MM-dd HH:m:ss") 但是O ...

  5. php 上传文件代码

    通过 PHP,能够把文件上传到server.里面加入一些图片的推断,假设不加推断文件的类型就能够上传随意格式的文件. 为了站点的安全,肯定不让上传php文件,假设有人进入你的后台,上传了一个php文件 ...

  6. 为什么很多IT公司不喜欢进过培训机构的人呢?

    转载原文链接:https://www.cnblogs.com/alex3714/p/9105765.html 这几天在知乎看到一个问题“为什么很多IT公司不喜欢进过培训机构的人呢?” 身为老男孩的教学 ...

  7. shell脚本命令远程连接ssh并执行命令

    环境: redhat 6.5 根据网上提供方法,测试了很多写法都不成功,测试了很久才有了以下脚本. 命令远程连接ssh并执行命令,scp/ftp等远程连接操作同理: #!/usr/bin/expect ...

  8. Python排序算法之选择排序

    选择排序 选择排序比较好理解,好像是在一堆大小不一的球中进行选择(以从小到大,先选最小球为例): 1. 选择一个基准球 2. 将基准球和余下的球进行一一比较,如果比基准球小,则进行交换 3. 第一轮过 ...

  9. python3-知识扩展扫盲易忘-zip的用法

    >>>a = [1,2,3] >>> b = [4,5,6]>>> c = [4,5,6,7,8]>>> zipped = zi ...

  10. Linux 第一周作业

    [](http://images2017.cnblogs.com/blog/1249774/201710/1249774-20171001234038872-10d31233192.pngd