The 15th UESTC Programming Contest Preliminary H - Hesty Str1ng cdoj1551

地址:http://acm.uestc.edu.cn/#/problem/show/1551

题目:

Hesty Str1ng

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

A chrysanthemum was painted on the second page, and we tried to use the magic power learned just now.

The beautiful flower was compacted to a colorful string SS representing by characters for some simplifying reasons.

As known, if we try to choose a substring AA of SS and concatenate it with an arbitrary non-empty string BB whose length is less than AA, we can get a new string TT.

The poetry told us the key to the eternity living secret is the number of the distinct palindrome strings made by the method above.

Two strings are considered different if and only if there are different characters in the same position of two strings.

Input

Only one line contains the string SS.

SS is composed by lowercase English characters, 1|S|1000001≤|S|≤100000.

Output

The key to the eternity living secret.

Sample input and output

Sample InputSample Output
abc
3

Hint

The palindrome strings can be made are "aba", "bcb", "abcba".

思路:

  对于一个长度为n的子串,如果在其后连接一个长度为x(1<=x<n)的字符串形成新串T,并且T为回文串。

  n=1时:形成的T的数量=0

  n>1时:形成的T的数量=1+sum.(sum:子串含有的不同回文后缀的数量)

  回顾下计算不同子串个数的后缀数组做法:

  

 

  下面先给出一个结论:

    sum[x]:表示后缀s[x....n-1]中s[k]==s[k+1]的个数

    ans=∑(n-sa[i]-height[i]+sum[sa[i]+height[i]]) (字符串下标从0开始。)

    并且当

       height[i]==0时  ans-=1;

       height[i]>=2&&ss[sa[i]+height[i]-1]==ss[sa[i]+height[i]]时  ans+=1;

       !height[i]&&ss[sa[i]+height[i]]==ss[sa[i]+height[i]+1]时  ans-=1;

    上面对应的三种情况分别是:

    1. 此时有排序后的后缀abbb,ba.

    2.  此时有排序后的后缀abb,abbba

    3. 此时有排序后的后缀a,bba

  具体证明过程我就不写了(PS:其实是我也不太会)

   参考自校队另一位dalao的博文:http://blog.csdn.net/prolightsfxjh/article/details/66970491

  具体见代码

    

 1 #include <cstdlib>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 
 6 const int N = 100005;
 7 int wa[N], wb[N], ws[N], wv[N];
 8 int s[N],sa[N],rank[N], height[N];
 9 char ss[N];
10 int sum[N];
11 bool cmp(int r[], int a, int b, int l)
12 {
13     return r[a] == r[b] && r[a+l] == r[b+l];
14 }
15 
16 void da(int r[], int sa[], int n, int m)
17 {
18     int i, j, p, *x = wa, *y = wb;
19     for (i = 0; i < m; ++i) ws[i] = 0;
20     for (i = 0; i < n; ++i) ws[x[i]=r[i]]++;
21     for (i = 1; i < m; ++i) ws[i] += ws[i-1];
22     for (i = n-1; i >= 0; --i) sa[--ws[x[i]]] = i;
23     for (j = 1, p = 1; p < n; j *= 2, m = p)
24     {
25         for (p = 0, i = n - j; i < n; ++i) y[p++] = i;
26         for (i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;
27         for (i = 0; i < n; ++i) wv[i] = x[y[i]];
28         for (i = 0; i < m; ++i) ws[i] = 0;
29         for (i = 0; i < n; ++i) ws[wv[i]]++;
30         for (i = 1; i < m; ++i) ws[i] += ws[i-1];
31         for (i = n-1; i >= 0; --i) sa[--ws[wv[i]]] = y[i];
32         for (std::swap(x, y), p = 1, x[sa[0]] = 0, i = 1; i < n; ++i)
33             x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p-1 : p++;
34     }
35 }
36 
37 void calheight(int r[], int sa[], int n)
38 {
39     int i, j, k = 0;
40     for (i = 1; i <= n; ++i) rank[sa[i]] = i;
41     for (i = 0; i < n; height[rank[i++]] = k)
42         for (k?k--:0, j = sa[rank[i]-1]; r[i+k] == r[j+k]; k++);
43 }
44 
45 int main()
46 {
47     int len;
48     long long ans=0;
49     scanf("%s",ss);
50     len=strlen(ss);
51     for(int i=0;i<len;i++)
52         s[i]=ss[i]-'a'+1;
53     s[len]=0;
54     da(s,sa,len+1,28);
55     calheight(s,sa,len);
56     for(int i=len-1;i>=0;i--)
57     if(ss[i]==ss[i+1])  sum[i]=sum[i+1]+1;
58     else    sum[i]=sum[i+1];
59     for(int i=1;i<=len;i++)
60     {
61         if(height[i]==0)ans--;
62         ans+=sum[sa[i]+height[i]]+len-sa[i]-height[i];
63         if(height[i]>=2&&ss[sa[i]+height[i]-1]==ss[sa[i]+height[i]])
64             ans++;
65         if(!height[i]&&ss[sa[i]+height[i]]==ss[sa[i]+height[i]+1])
66             ans--;
67         //printf("x==%d %lld\n",i,ans);
68     }
69     printf("%lld\n",ans);
70     return 0;
71 }

 

转载于:https://www.cnblogs.com/weeping/p/6640878.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyui 点滴记录

为什么80%的码农都做不了架构师&#xff1f;>>> 【1.安装】&#xff1a;pip install easygui 【2.常用】 integerbox 交互式输入数字textbox 交互式输入文本ccbox 确认判断boolbox 是否判断multchoicebox 多选条目choicebox 单选条目buttonbox 单选按钮【3.体验一…

IAR切BANK--BANK说明

一、为什么要用到BANK&#xff1f; C51单片机的最大寻址范围为2^1664K&#xff0c;为了突破64K代码的限制&#xff0c;就需要采用C51的切BANK。 二、切BANK的原理 代码地址空间的上半部 ,以重叠BANK0的物理地址空间 , 硬件设计了 n个存储 器页面来存储程序代码 。在任一时刻 …

hdu 4293 Groups DP

http://acm.hdu.edu.cn/showproblem.php?pid4293 题意&#xff1a; 有n个人分成了若干组走在一条林荫道路上&#xff0c;导游为了能够确定人数&#xff0c;要求每个人喊出自己所在的队伍前边有多少人Ai表示,后边有多少人Bi表示&#xff0c;于是我们得到了n条信息。这里面有错误…

IAR切BANK--命令连接器文件xcl格式说明

IAREWARM中段后缀含义 后缀 段类型 含义 AC CONST 绝对地址定位常数 AN DATA 用关键字__no_init声明的绝对地址定位数据 C CONST 常数 I DATA 初始化值为非0的数据 ID CONST 上述数据的初始式 N DATA 未初始化的数据 Z DATA 初始化值为0的数据 ROM用于…

DBA_Oracle Table Partition表分区概念汇总(概念)

2014-06-20 Created By BaoXinjian 一、摘要 有关表分区的一些维护性操作&#xff1a; 注&#xff1a;分区根据具体情况选择。 表分区有以下优点&#xff1a; 1、数据查询&#xff1a;数据被存储到多个文件上&#xff0c;减少了I/O负载&#xff0c;查询速度提高。 2、数据修剪&…

electron打包vue项目

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 创建项目 点击这里 添加electron-builder 1、在项目目录下运行命令&#xff1a;vue add electron-builder 2、electron-…

Hdu 4293 DP

题意&#xff1a; n个人说自己前面有多少人 后面有多少人 求出说真话人数最多的情况 每个样例有 一个 n 表示n个人 接下来 n 行有a b 表示他前面的人数和后面的人数 思路&#xff1a; 如果已经知道了其中一组的人数~ 就往前找..找在这一组之前与这一组的话不矛盾的最多人数 Ti…

IAR切BANK--程序中的使用

一、在IAR的集成开发环境中实现数据变量定位方法如下三种 1、__no_init char alpha 0x0200; 2、#pragma location 0x0202 const int beta; 3、const int gamma 0x0204 3; 或&#xff1a; 1&#xff09;__no_init int alpha "MYSEGMENT"; //MYSEGMENT段可在…

CSS/CSS3语法新特性笔记

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 CSS层叠样式表 三大特性 层叠性&#xff1a;相同的样式会覆盖 继承性&#xff1a;属性可向下继承 优先级&#xff1a;范…

C# winform 自定义皮肤制作

最近要做个软件正在做技术准备&#xff0c;由于WINFORM生成的窗体很丑陋&#xff0c;一个好的软件除了功能性很重要外&#xff0c;UI的体验也是不容忽视的。习惯性的在网上搜素了下&#xff0c;换肤控件也有好几款&#xff0c;但是有些用起来不是很好用&#xff0c;好点的也要花…

蓝牙PROFILE

Bluetooth的一个很重要特性&#xff0c;就是所有的Bluetooth产品都无须实现全部 的Bluetooth规范。为了更容易的保持Bluetooth设备之间的兼容&#xff0c;Bluetooth规范中定义了Profile。Profile定义了设备如何实现一种连接或者应用&#xff0c;你可以把Profile理解为连接层或者…

netty系列之:EventLoop,EventLoopGroup和netty的默认实现

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 目录* 简介 EventLoopGroup和EventLoopEventLoopGroup在netty中的默认实现EventLoop在netty中的默认实现总结 简介 在net…

Oracle安装部署之RedHat安装Oracle11g_R2

硬件配置 内存 &#xff1a;≥1G 硬盘空间&#xff1a;≥10G 上传oracle11g安装包&#xff1a; putty上用wcw用户登录&#xff0c;通过ftp服务上传oracle安装文件到/home/wcw目录下解压 #unzip linux_11gR2_database_1of2.zip #unzip linux_11gR2_database_2of2.zip 检查和安装…

Fans没信心,回家继续修行

今天在CSDN上看了一篇的文章&#xff0c;感觉自己实在是太菜了&#xff0c;以至于对毕业之后从事IT行业没有了任何信心。现在也不清楚&#xff0c;自己能否在it行业混下去。自己的技术实在是一个水啊。8号就要回家了&#xff0c;兄弟姐妹们如果有事情&#xff0c;请发短信至 15…

基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 在我的各种开发框架中&#xff0c;数据访问有的基于微软企业库&#xff0c;有的基于EFCore的实体框架&#xff0c;两者各有其…

Unity 实现物体破碎效果(转)

感谢网友分享&#xff0c;原文地址&#xff08;How to Make an Object Shatter Into Smaller Fragments in Unity&#xff09;&#xff0c;中文翻译地址&#xff08;Unity实现物体破碎效果&#xff09; In this tutorial I will show you how to create a simple shattering ef…

CC254x--OSAL

OSAL运行原理 蓝牙协议栈PROFILE、所有的应用程序、驱动等都是围绕着OSAL组织运行的。OSAL&#xff08;Operating System Abstraction Layer&#xff09;操作系统抽象层&#xff0c;它不是一个真正的操作系统&#xff08;它没有 Context Switch 上下文切换功能&#xff09;&am…

mysql跨节点join——federated引擎

一、 什么是federated引擎 mysql中的federated类似于oracle中的dblink。 federated是一个专门针对远程数据库的实现&#xff0c;一般情况下在本地数据库中建表会在数据库目录中生成相对应的表定义文件&#xff0c;并同时生成相对应的数据文件。 [图] 但是通过federated引擎创建…

【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 ✿ 阅读源码思路&#xff1a; 先跳过非重点&#xff0c;深入每个方法&#xff0c;进入的时候可以把整个可以理一下方法的执…