回文树(统计所有回文串的个数) - MCCME 1750 Подпалиндромы

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: Подпалиндромы  Problem's Link:  http://informatics.mccme.ru//mod/statements/view.php?chapterid=1750#   Mean:  给你一个长度不超过1e5的字符串,要统计总共有多少个回文串。

Подпалиндромы 

Problem's Link:  http://informatics.mccme.ru//mod/statements/view.php?chapterid=1750#


 

Mean: 

给你一个长度不超过1e5的字符串,要统计总共有多少个回文串。(第一次刷俄语题,还好有google翻译)。

analyse:

如果题目说是不同回文串的话,这题就是一个裸的回文树。

由于要求所有子串的回文数,所以我们在插入的时候还需要使用suffixLink往上走统计答案。

Time complexity: O(N)

 

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-08-17-19.13
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define  LL long long
#define  ULL unsigned long long
using namespace std;

const int MAXN = 105000;
struct node
{
      int next [ 26 ];
      int len;
      int sufflink;
      int num;
};
int len;
char s [ MAXN ];
node tree [ MAXN ];
int num; // node 1 - root with len -1, node 2 - root with len 0
int suff; // max suffix palindrome
long long ans;
bool addLetter( int pos)
{
      int cur = suff , curlen = 0;
      int let = s [ pos ] - 'a';
      while( true)
      {
            curlen = tree [ cur ]. len;
            if( pos - 1 - curlen >= 0 &&s [ pos - 1 - curlen ] ==s [ pos ]) break;
            cur = tree [ cur ]. sufflink;
      }
      if( tree [ cur ]. next [ let ])
      {
            suff = tree [ cur ]. next [ let ];
            return false;
      } suff = ++ num;
      tree [ num ]. len = tree [ cur ]. len + 2;
      tree [ cur ]. next [ let ] = num;
      if( tree [ num ]. len == 1)
      {
            tree [ num ]. sufflink = 2;
            tree [ num ]. num = 1;
            return true;
      }
      while( true)
      {
            cur = tree [ cur ]. sufflink;
            curlen = tree [ cur ]. len;
            if( pos - 1 - curlen >= 0 && s [ pos - 1 - curlen ] == s [ pos ])
            {
                  tree [ num ]. sufflink = tree [ cur ]. next [ let ];
                  break;
            }
      }
      tree [ num ]. num = 1 + tree [ tree [ num ]. sufflink ]. num;
      return true;
}
void initTree()
{
      num = 2; suff = 2;
      tree [ 1 ]. len = - 1; tree [ 1 ]. sufflink = 1;
      tree [ 2 ]. len = 0; tree [ 2 ]. sufflink = 1;
}
int main()
{
      gets(s);
      initTree();
      for( int i = 0;s [ i ]; i ++)
      {
            addLetter( i);
            ans += tree [ suff ]. num;
      } cout << ans << endl;
      return 0;
}

 

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
存储 数据采集 监控
【2022持续更新】大数据最全知识点整理-数据仓库篇
【2022持续更新】大数据最全知识点整理-数据仓库篇
2134 0
【2022持续更新】大数据最全知识点整理-数据仓库篇
|
小程序 前端开发 PHP
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
PHP实现生成小程序二维码带参数进入指定页面、小程序URL scheme实现携带数据跳转小程序
338 0
|
11月前
|
消息中间件 SQL 分布式计算
大数据-64 Kafka 高级特性 分区Partition 分区重新分配 实机实测重分配
大数据-64 Kafka 高级特性 分区Partition 分区重新分配 实机实测重分配
327 7
|
9月前
|
人工智能 PyTorch 算法框架/工具
【AI系统】动手实现自动微分
本章介绍如何实现自动微分,重点讲解前向自动微分的原理及Python实现方法。通过操作符重载,将程序分解为基础表达式组合,利用链式法则计算导数。示例代码展示了如何使用自定义类`ADTangent`实现加、减、乘、log、sin等操作的自动微分,验证了与PyTorch和MindSpore等框架的一致性。
247 2
【AI系统】动手实现自动微分
|
8月前
|
机器学习/深度学习 人工智能 算法
FinRobot:开源的金融专业 AI Agent,提供市场预测、报告分析和交易策略等金融解决方案
FinRobot 是一个开源的 AI Agent 平台,专注于金融领域的应用,通过大型语言模型(LLMs)构建复杂的金融分析和决策工具,提供市场预测、文档分析和交易策略等多种功能。
814 13
FinRobot:开源的金融专业 AI Agent,提供市场预测、报告分析和交易策略等金融解决方案
|
12月前
|
网络协议 Linux C++
超级好用的C++实用库之网络
超级好用的C++实用库之网络
145 0
|
负载均衡 安全
思科接入点 (AP) 操作的模式
【8月更文挑战第24天】
472 0
|
Java
java通过idea启动查看类加载来源信息
java通过idea启动查看类加载来源信息
328 0
执行脚本出现 standard in must be a tty
出现该提示是因为你执行的脚本的时候并不是在没有对应用户的环境变量,应该在脚本中加入su - username,来加载环境变量。
596 0
|
机器学习/深度学习 人工智能 运维
智能化运维的演进之路:从自动化到人工智能
本文将探索智能化运维(AIOps)的发展脉络,从早期的脚本自动化到现今集成人工智能技术的高级阶段。文章将基于最新的行业报告、学术论文和案例研究,深入分析AIOps如何通过数据驱动的方法提升运维效率和预测性维护的能力,以及这一转变对IT运维专业人员技能要求的影响。

热门文章

最新文章