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. 2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块

    1.multiprocessing模块 multiprocessing模块就是跨平台版本的多进程模块. multiprocessing模块提供了一个Process类来代表一个进程对象, 2.Proce ...

  2. LeetCode:33. Search in Rotated Sorted Array(Medium)

    1. 原题链接 https://leetcode.com/problems/search-in-rotated-sorted-array/description/ 2. 题目要求 给定一个按升序排列的 ...

  3. 解决美图看看不出现在“Open with”的子菜单中的问题

    最近由于特殊需求,要使用美图看看,Win10系统,美图看看工作倒也正常,但出现一个比较郁闷的情况,就是只能在“Open with”的最下面一个子菜单中选择“Choose another app”,然后 ...

  4. VIN码识别/车架号OCR识别:快速占领汽车后市场数据入口

    大数据时代,企业在数据入口方面的竞争越来越激烈,这种对于入口级的大数据“争夺战”,让很多企业在数据挖掘和收集的技术方面开始加快更新速度. 在当前IT行业激烈竞争环境之下,对于入口产品的控制成为了大数据 ...

  5. mysql新手进阶03

    当年忠贞为国酬,何曾怕断头? 如今天下红遍,江山靠谁守? 业未就,身躯倦,鬓已秋. 你我之辈,忍将夙愿,付与东流? 数据库结构如下: 仓库(仓库号, 城市, 面积) 订购单(职工号, 供应商号, 订购 ...

  6. 【token接口】-jmeter

    token 接口 3步骤 1.登录接口 2.提取登录接口的token 3.http 信息管理头   把提取的cookie传入  就可以了

  7. 简单的图片滑动效果插件 jQuery.iocnSlider.js

    近几日在制作一个客户引导页面,其中有一个图片展示而且带滑动的效果.好久没练手了,索性自己写一个插件吧. 依据设计原型,需要满足两套分辨率下图片不同的尺寸,所以在css中使用了media query的相 ...

  8. 珍珠 Median Weight Bead 977

    描述 There are N beads which of the same shape and size, but with different weights. N is an odd numbe ...

  9. LeetCode 100——相同的树

    1. 题目 2. 解答 针对两棵树的根节点,有下列四种情况: p 和 q 都为空,两棵树相同: p 不为空 q 为空,两棵树不相同: p 为空 q 不为空,两棵树不相同: p 和 q 都不为空,如果两 ...

  10. kvm网络虚拟化

    网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大. 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来. 为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图 这是 Open ...