zoukankan      html  css  js  c++  java
  • P3649 [APIO2014]回文串(回文自动机)

    题目链接
    题意:给你一个由小写拉丁字母组成的字符串 s。
    我们定义s的一个子串的存在值为这个子串在s中出现的次数乘以这个子串的长度。
    对于给你的这个字符串s,求所有回文子串中的最大存在值。
    思路:建出回文树,使用类似后缀自动机统计出现次数的方法。
    由于回文树的构造过程中,节点本身就是按照拓扑序插入,因此只需要逆序枚举所有状态,将当前状态的出现次数加到其 fail 指针对应状态的出现次数上即可。

    /*
    给你一个由小写拉丁字母组成的字符串 s。
    我们定义s的一个子串的存在值为这个子串在s中出现的次数乘以这个子串的长度。
    
    对于给你的这个字符串s,求所有回文子串中的最大存在值。
    */ 
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn = 300000 + 5;
    namespace pam {
    int sz, tot, last;
    int cnt[maxn], ch[maxn][26], len[maxn], fail[maxn];
    char s[maxn];
    int node(int l) {
      sz++;
      memset(ch[sz], 0, sizeof(ch[sz]));
      len[sz] = l;
      fail[sz] = cnt[sz] = 0;
      return sz;
    }
    void clear() {
      sz = -1;
      last = 0;
      s[tot = 0] = '$';
      node(0);
      node(-1);
      fail[0] = 1;
    }
    int getfail(int x) {
      while (s[tot - len[x] - 1] != s[tot]) x = fail[x];
      return x;
    }
    void insert(char c) {
      s[++tot] = c;
      int now = getfail(last);
      if (!ch[now][c - 'a']) {
        int x = node(len[now] + 2);
        fail[x] = ch[getfail(fail[now])][c - 'a'];
        ch[now][c - 'a'] = x;
      }
      last = ch[now][c - 'a'];
      cnt[last]++;
    }
    ll solve() {
      ll ans = 0;
      for (int i = sz; i >= 0; i--) {
        cnt[fail[i]] += cnt[i];
      }
      for (int i = 1; i <= sz; i++) {
        ans = max(ans, 1ll * len[i] * cnt[i]);
      }
      return ans;
    }
    }  // namespace pam
    char s[maxn];
    int main() {
      pam::clear();
      scanf("%s", s + 1);
      for (int i = 1; s[i]; i++) {
        pam::insert(s[i]);
      }
      printf("%lld
    ", pam::solve());
      return 0;
    }
    
  • 相关阅读:
    java 日志框架的选择Log4j->SLF4j->Logback
    linux上的常用命令
    Zookeeper配置Kafka
    分布式日志收集框架Flume
    Spark Streaming简介
    Spring Cloud学习笔记之微服务架构
    IntelliJ IDEA学习记录
    firefox插件-自动化测试工具-selenium IDE
    大数据01
    使用java开发spark的wordcount程序(多种实现)
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/13817066.html
Copyright © 2011-2022 走看看