2017中国大学生程序设计竞赛-哈尔滨站 A - Palindrome
Palindrome
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 426 Accepted Submission(s): 163
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.
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.
ababcbabccbaabc
/*************************************************************************
> 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的更多相关文章
- HDU6237-A Simple Stone Game-找素因子(欧拉函数)-2017中国大学生程序设计竞赛-哈尔滨站-重现赛
A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- HDU6235-Permutation-水题-2017中国大学生程序设计竞赛-哈尔滨站-重现赛
Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tot ...
- 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 ...
- HDU 6235.Permutation (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)
Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Tot ...
- 2017中国大学生程序设计竞赛-哈尔滨站 Solution
A - Palindrome 题意:给出一个字符串,找出其中有多少个子串满足one-half-palindromic 的定义 思路:其实就是找一个i, j 使得 以i为中轴的回文串长度和以j为中轴的 ...
- 2017中国大学生程序设计竞赛-哈尔滨站 H - A Simple Stone Game
A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- 【2017中国大学生程序设计竞赛-哈尔滨站】B - K-th Number
原题: 题意: 给你一个长度为N的正整数组A,对于这个数组的所有子区间,若长度小于k则不管它,若长度大于等于k则取第k大放入数组B 问你B中第M大的数是谁 一眼序列分治,然而没思路 数据结构?能想到从 ...
- HDU 6273.Master of GCD-差分数组 (2017中国大学生程序设计竞赛-杭州站-重现赛(感谢浙江理工))
Super-palindrome 题面地址:http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 这道题是差分数组的题目,线 ...
- 【2017中国大学生程序设计竞赛 - 网络选拔赛】Palindrome Function
[链接]http://acm.hdu.edu.cn/showproblem.php?pid=6156 [题意] 已知函数f(x, k),如果10进制数x在k进制下是个回文数,那么f(x, k)值为k, ...
随机推荐
- eclipse导入jmeter3.1源码并运行
jmeter3.1源码地址:https://archive.apache.org/dist/jmeter/source/ 1.打开eclipse,新建一个java project的项目,并点击next ...
- hdu1217Arbitrage(floyd+map)
Arbitrage Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- hdu1848Fibonacci again and again(sg函数)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- Linux命令应用大词典-第12章 程序编译
12.1 gcc:GNU项目的C和C++编译器 12.2 gdberver:为GNU调试的远程服务器 12.3 cmake:跨平台的Makefile生成工具 12.4 indent:更改通过插入或删除 ...
- C++11 TypeList 妙用
源码展示: #include <iostream> using namespace std; template <typename ... Args> struct typel ...
- SQL语言重点学习
数据库的操作任务通常包括以下几个方面: 1.查询数据. 2.在表中插入,修改和删除记录. 3.建立,修改和删除数据对象. 4.控制对数据和数据对象的读写. 5.保证数据库一致性和完整性. SQL语言学 ...
- 给eclipse安装color-theme插件
给eclipse安装color-theme插件 2016年03月22日 19:16:01 ming_love 阅读数:5193 标签: Eclipse Color Theme 更多 个人分类: jav ...
- docker学习2
今天继续学习docker! 搜索镜像 docker search centos 下载镜像 docker pull name(镜像名字) 查看镜像docker images 字段含义分析: TAG:仓库 ...
- Office 365 E3功能
本文简要总结了Office 365E3的功能
- 卸载CDH5.7
CDH5.7卸载1.记录用户数据目录2.关闭所有服务2.1在CM中,选择某个集群,然后停止集群.2.2逐个关闭CDH中的服务3.删除parcels4.删除集群5.卸载Cloudera manager ...