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. P1563 玩具谜题

    P1563 玩具谜题 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: ...

  2. 使用union 外加count

    explain extended and name='aaa')) t; +----+--------------+------------+-------+---------------+----- ...

  3. Prism MEF example

    Related Attributes These attributes are under namespace System.ComponentModel.Composition Import The ...

  4. OpenSUSE 11 安装Qt5.0,失败,失败,失败,留个坑,以后来填,万一实现了呢

    我又来无耻的写问题来了,这次还真的是没有解决,线留坑吧,万一以后实现了. 同样,这次也是以恶搞网友说听说想在open suse 上面安装5.0版本以后的Qt,自己折腾好几没有成功. 我一想,哎,这不是 ...

  5. selenium自动追踪微信小程序审核方案

    小程序随着腾讯的不断推广,变的越来越普及,同时更新迭代的速度也越来越快,种类越来越多,那么在如何保证时效性就显得尤为重要,其中很重要一个环节就在于小程序审核通过之后,能否立刻通知到相关技术人员进行发布 ...

  6. Java JDK5.0新特性

    JDK5.0新特性 虽然JDK已经到了1.8 但是1.5(5.0)的变化是最大的 1. 增强for循环 foreach语句 foreach简化了迭代器 作用: 对存储对象的容器进行迭代 (数组, co ...

  7. Anyproxy抓包工具

    1.安装Nodejs和AnyProxy以及安装模拟器(移动端抓包工具) 第一步:nodejs下载地址:http://nodejs.cn/download/ 下载Windows版本,直接运行安装即可, ...

  8. Java学习 · 初识 面向对象基础二

    Package 为什么需要使用package a)   解决类重名的问题 b)   便于管理类 怎么使用package a)   类的第一句非注释性语句 b)   命名:域名倒着写,再加上模块名 注意 ...

  9. 手机端网页返回顶部js代码

    <!DOCTYPE html>  <html>  <head>  <meta http-equiv="Content-Type" cont ...

  10. 在使用Pipeline串联多个stage时model和非model的区别

    train.csv数据: id,name,age,sex1,lyy,20,F2,rdd,20,M3,nyc,18,M4,mzy,10,M 数据读取: SparkSession spark = Spar ...