Palindrome

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 426    Accepted Submission(s): 163

Problem Description
Alice
like strings, especially long strings. For each string, she has a
special evaluation system to judge how elegant the string is. She
defines that a string S[1..3n−2](n≥2) is one-and-half palindromic if and only if it satisfies S[i]=S[2n−i]=S[2n+i−2](1≤i≤n).For example, abcbabc is one-and-half palindromic string, and abccbaabc
is not. Now, Alice has generated some long strings. She ask for your
help to find how many substrings which is one-and-half palindromic.
 
Input
The
first line is the number of test cases. For each test case, there is
only one line containing a string(the length of strings is less than or
equal to 500000), this string only consists of lowercase letters.
 
Output
For each test case, output a integer donating the number of one-and-half palindromic substrings.
 
Sample Input
1
ababcbabccbaabc
 
Sample Output
2
/*************************************************************************
> File Name: A.cpp
> Author: LyuCheng
> Created Time: 2017-12-01 21:54
> Description:
题意:给你一个字符串问你有多少个子串满足s[i]=s[2*n-i]=s[2*n+i-2] 思路:满足条件的子串实际上是关于两点回文的一个子串,并且这个回文串
一定是奇数回文,用马拉车算法求出以每个点的回文半径,如果满足题
目的条件,设i<j是这个子串的两个回文点,那么i-j<=pos[i]&&i-j<=pos[j]
用树状数组记录一下,然后统计
************************************************************************/
#include <bits/stdc++.h> #define MAXN 567890
#define lowbit(x) x&(-x)
#define LL long long using namespace std; int t;
int n;
char str[MAXN<<];
char tmp[MAXN<<];
int Len[MAXN<<];
int pos[MAXN<<];
int c[MAXN<<];
LL res;
vector<int>v[MAXN<<]; inline void update(int x){
while(x<MAXN){
c[x]++;
x+=lowbit(x);
}
} inline int getsum(int x){
int s=;
while(x>){
s+=c[x];
x-=lowbit(x);
}
return s;
} int cal(char *st){
int i,len=strlen(st);
tmp[]='@';//字符串开头增加一个特殊字符,防止越界
for(i=;i<=*len;i+=){
tmp[i]='#';
tmp[i+]=st[i/];
}
tmp[*len+]='#';
tmp[*len+]='$';//字符串结尾加一个字符,防止越界
tmp[*len+]=;
return *len+;//返回转换字符串的长度
}
//Manacher算法计算过程
int manacher(char *st,int len){
int mx=,ans=,po=;//mx即为当前计算回文串最右边字符的最大值
for(int i=;i<=len;i++){
if(mx>i)
Len[i]=min(mx-i,Len[*po-i]);//在Len[j]和mx-i中取个小
else
Len[i]=;//如果i>=mx,要从头开始匹配
while(st[i-Len[i]]==st[i+Len[i]])
Len[i]++;
if(Len[i]+i>mx){//若新计算的回文串右端点位置大于mx,要更新po和mx的值
mx=Len[i]+i;
po=i;
}
ans=max(ans,Len[i]);
}
return ans-;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度
}
inline void init(){
memset(str,'\0',sizeof str);
memset(tmp,'\0',sizeof tmp);
memset(c,,sizeof c);
memset(pos,,sizeof pos);
for(int i=;i<MAXN;i++)
v[i].clear();
res=;
} int main(){
scanf("%d",&t);
while(t--){
init();
scanf("%s",str);
n=cal(str);
manacher(tmp,n);
int p=;
for(int i=;i<n;i+=){
pos[++p]=Len[i]/-;
v[p-pos[p]].push_back(p);
}
n=strlen(str);
for(int i=;i<=n;i++){
for(int j=;j<(int)v[i].size();j++)
update(v[i][j]);
res+=getsum(min(i+pos[i],n))-getsum(i);
}
printf("%lld\n",res);
}
return ;
}

2017中国大学生程序设计竞赛-哈尔滨站 A - Palindrome的更多相关文章

  1. HDU6237-A Simple Stone Game-找素因子(欧拉函数)-2017中国大学生程序设计竞赛-哈尔滨站-重现赛

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  2. HDU6235-Permutation-水题-2017中国大学生程序设计竞赛-哈尔滨站-重现赛

    Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  3. HDU 6237.A Simple Stone Game-欧拉函数找素因子 (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  4. HDU 6235.Permutation (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)

    Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  5. 2017中国大学生程序设计竞赛-哈尔滨站 Solution

    A - Palindrome 题意:给出一个字符串,找出其中有多少个子串满足one-half-palindromic 的定义 思路:其实就是找一个i, j  使得 以i为中轴的回文串长度和以j为中轴的 ...

  6. 2017中国大学生程序设计竞赛-哈尔滨站 H - A Simple Stone Game

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  7. 【2017中国大学生程序设计竞赛-哈尔滨站】B - K-th Number

    原题: 题意: 给你一个长度为N的正整数组A,对于这个数组的所有子区间,若长度小于k则不管它,若长度大于等于k则取第k大放入数组B 问你B中第M大的数是谁 一眼序列分治,然而没思路 数据结构?能想到从 ...

  8. HDU 6273.Master of GCD-差分数组 (2017中国大学生程序设计竞赛-杭州站-重现赛(感谢浙江理工))

    Super-palindrome 题面地址:http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 这道题是差分数组的题目,线 ...

  9. 【2017中国大学生程序设计竞赛 - 网络选拔赛】Palindrome Function

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6156 [题意] 已知函数f(x, k),如果10进制数x在k进制下是个回文数,那么f(x, k)值为k, ...

随机推荐

  1. Ubentu编译Android源码(AOSP)

    前言: 一直想要编译一下Android 源码,之前去google 看,下载要下载repo. 当时很懵逼,repo 是个什么?(repo 是一个python 脚本,因为Android 源码git 仓库太 ...

  2. clr via c#读书笔记四:call、callvirt

    1.嵌套类,就是定义在类中的类:嵌套类可以访问外部类的方法.属性.字段而不管访问修饰符的限制,但是外部类只能够访问修饰符为public.internal的嵌套类的字段.方法.属性: 2.CLR如何调用 ...

  3. iReport jasperReports 生成表格

    使用iReport生成表格   一 环境:iReport-5.6.0  JDK7 1.注意,iReport的最新版本目前还不支持JDK8,如果项目工程已经配置了JDK8,那也不用去修改环境变量和工程的 ...

  4. 180713-Spring之借助Redis设计访问计数器之扩展篇

    之前写了一篇博文,简单的介绍了下如何利用Redis配合Spring搭建一个web的访问计数器,之前的内容比较初级,现在考虑对其进行扩展,新增访问者记录 记录当前站点的总访问人数(根据Ip或则设备号) ...

  5. 制作一个App的完整流程是哪些

    APP开发流程其实并不复杂,但是对于客户来说,.一般移动APP开发都离不开UI设计师.前端开发.后端开发.测试专员.产品经理等,由于他们的工作性质都不一样,我们且先把APP软件开发项目分为三个阶段: ...

  6. Intro to Probabilistic Model

    概率论复习 概率(Probability) 频率学派(Frequentist):由大量试验得到的期望频率(致命缺陷:有些事情无法大量试验,例如一封邮件是垃圾邮件的概率,雷达探测的物体是一枚导弹的概率) ...

  7. gossip版本raft算法实现

    raft算法的实现概述 节点的启动和加入: 1. 第一个节点启动,发现没有其他的member节点,则自己变成master 2. 第二个节点启动并加入第一个节点,发现有member节点,并且master ...

  8. C语言struct中的长度可变数组(Flexible array member)

    C_struct中的长度可变数组(Flexible array member) Flexible array member is a feature introduced in the C99 sta ...

  9. POJ 2104 K-th Number(划分树)

    Description You are working for Macrohard company in data structures department. After failing your ...

  10. 20170413B端业务访问故障排查思路

    现象: 1.全国用户电视端页面无法显示,刷不出版面. 2.后端服务无法打开,报错,504,502   显示服务器端业务故障超时. 3.其他业务也出现缓慢情况,并不严重. 排查: 1.系统服务排查,常规 ...