2017.10.6 国庆清北 D6T3 字符串
题目描述
如果把一个字符串从头到尾翻转后和原字符串相等,我们称之为回文串,比如“aabaa”、“())(”、“2017102”。
如果一个字符串存在两个出现过的字母出现的次数相等,我们称之为好
的字符串。
现在给一个由小写字母组成的字符串,问在这个字符串的所有连续的串
中,好的回文串有多少个。(两个相同的回文串出现在不同位置算多次)。
输入输出格式
输入格式:
一行一个小写字母组成的字符串。
输出格式:
一行一个整数,表示答案。
输入输出样例
abcbaabcba
6
【样例解释】
abcba s[1..5] a,b 出现次数相等
baab s[4..7] a,b 出现次数相等
cbaabc s[3..8] a,b 出现次数相等
bcbaabcb s[2..9] a,c 出现次数相等
abcbaabcba s[1..10] a,b 出现次数相等
abcba s[6..10] a,b 出现次数相等
说明
len 表示字符串长度。
对于30% 的数据, len <=10^2。
对于60% 的数据, len <= 10^3。
对于100% 的数据,1 <= len <= 10^4。
/*
我们发现回文串是可以二分的
比如:bbbabcbaabcba 我们以第1个c为中心,发现回文半径是3,大于3一定不是回文串。当回文串长度为偶数的时候,我们需要特殊处理一下。
现在有一个结论:本质不同的回文串个数只有O(N)个
本质不同:字符串本身是不同的。
每一次处理完回文串,我们要把他的hash值记录下来。
*/ #include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std; typedef unsigned long long ULL;
typedef long long LL; char s[];
ULL h[],rh[],pw[];
int L; ULL hs(int l,int r)
{
return h[r]-h[l-]*pw[r-l+];
}
ULL rhs(int l,int r)
{
return rh[l]-rh[r+]*pw[r-l+];
}
struct N
{
int a[];
bool ok(){
int b[];
for(int i=;i<;i++) b[i]=a[i];
sort(b,b+);
for(int i=;i<;i++)
{
if(b[i]>&& b[i] == b[i+]) return true;
}
return false;
}
void clear()
{
memset(a,,sizeof a);
}
};
LL ans=;
map<ULL,LL> num;
map<ULL,N> A;
void solve_odd() //奇数
{
for(int i=;i<=L;i++)
{
int l=,r=min(i,L-i+)+;
while(r-l>)
{
int mid=(l+r)/;
if(hs(i-mid+,i+mid-)==rhs(i-mid+,i+mid-)) l=mid;
else r=mid;
}
int p=l;
int tmp=p;
while(tmp>=&&num.find(hs(i-tmp+,i+tmp-))==num.end()) tmp--;
LL sum=;
N st;
st.clear();
if(tmp>=)
{
sum=num[hs(i-tmp+,i+tmp-)];
st=A[hs(i-tmp+,i+tmp-)];
}
while(tmp<p)
{
st.a[s[i+tmp]-'a']+=(tmp==?:);
if(st.ok()) sum++;
num[hs(i-tmp,i+tmp)]=sum;
A[hs(i-tmp,i+tmp)]=st;
tmp++;
}
ans+=sum;
}
}
void solve_even() //偶数
{
A.clear();
num.clear();
for(int i=;i<L;i++)
{
int l=,r=min(i,L-i)+;
while(r-l>)
{
int mid=(l+r)/;
if(hs(i-mid+,i+mid)== rhs(i-mid+,i+mid)) l=mid;
else r=mid;
}
int p=l;
int tmp=p;
while(tmp>=&&num.find(hs(i-tmp+,i+tmp))==num.end()) tmp--;
LL sum = ;
N st;
st.clear();
if(tmp>=)
{
sum=num[hs(i-tmp+,i+tmp)];
st=A[hs(i-tmp+,i+tmp)];
}
while(tmp<p)
{
st.a[s[i+tmp+]-'a']+=;
if(st.ok()) sum++;
num[hs(i-tmp,i+tmp+)]=sum;
A[hs(i-tmp,i+tmp+)]=st;
tmp++;
}
ans+=sum;
}
} int main()
{
scanf("%s",s+);
L=strlen(s+);
s[]='#';
pw[]=;
for(int i=;i<=L;i++) pw[i]=pw[i-]*; ///hash值
for(int i=;i<=L;i++) h[i]=h[i-]*+s[i];
for(int i=L;i>=;i--) rh[i]=rh[i+]*+s[i];
solve_odd();
solve_even();
printf("%lld\n",ans);
fclose(stdout);
return ;
}
2017.10.6 国庆清北 D6T3 字符串的更多相关文章
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
- 2017.10.3 国庆清北 D3T1 括号序列
题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的括号序列. 若A是合法的括号序列,则(A)是合法的括号序列. 若A和B分别是合法的括号序列,则AB是合法的 ...
- 2017.10.4 国庆清北 D4T2 正方形
题目描述 在一个10000*10000的二维平面上,有n颗糖果. LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果! 事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖 ...
- 2017.10.6 国庆清北 D6T2 同余方程组
题目描述 求关于x 的同余方程组 x%a1 = b1 x%a2 = b2 x%a3 = b3 x%a4 = b4 的大于等于0 的最小整数解. 输入输出格式 输入格式: 一行8 个整数,表示a1; b ...
- 2017.10.6 国庆清北 D6T1 排序
题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. 比如a 序列 ...
- 2017.10.3 国庆清北 D3T3 解迷游戏
题目描述 LYK进了一家古董店,它很想买其中的一幅画.但它带的钱不够买这幅画. 幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它. 老板有一个n*m的矩阵,他想 ...
- 2017.10.3 国庆清北 D3T2 公交车
题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点. LYK想让小怪兽们尽可能的到达自己想 ...
- 2017.10.4 国庆清北 D4T1 财富
(其实这题是luogu P1901 发射站 原题,而且数据范围还比luogu小) 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在 ...
- 2017.10.7 国庆清北 D7T1 计数
题目描述 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍数. 输入输出格式 输入格式: 输入文件名为count.in. 第一行,包含两个整数:n ...
随机推荐
- tkinter学习笔记_01
知识点目录: 1. 文本框 Label var = tk.StringVar() # 文本框 bg 背景颜色 fonnt 字体设置 width 长 height 高 l = tk.Label(root ...
- Harbor仓库配置https访问
注:高版本(14以上)docker执行login命令,默认使用https,且harbor必须使用域名,只是用ip访问是不行的. 假设使用的网址是:www.harbor.mobi,本机ip是192.16 ...
- WebAPI 之问题记录
这篇博客是博主的第一篇博客,主要用于webapi学习过程中的问题记录 问题1: 重写OnAuthorization权限验证时,遇到AllowAnonymousAttribute特性不起作用的问题 p ...
- IOC+EF+Core项目搭建EF封装(一)
添加应用Microsoft.EntityFrameworkCore:Microsoft.EntityFrameworkCore.Design:Microsoft.EntityFrameworkCore ...
- C#破解dll
使用反编译工具对dll文件进行反编译,找到校验过期的相关代码,反编译工具可以使用ILSpy或Reflector; 使用ildasm.exe工具将dll导出成il文本文件,在该文件中找到相关的代码进行修 ...
- python3基础之“小练习(3)”
(二十四)将字符串"A screaming comes across the sky."中所有的"s"字符替换为美元符号. # a="A scream ...
- mac环境下Android 反编译
连接地址: https://www.jianshu.com/p/3a305f32c4a3
- 转 CentOS 初体验十四:阿里云安装Gitlab
原文 https://blog.csdn.net/zhaoyanjun6/article/details/79144175 非Unix操作系统(Windows) GitLab是专为Unix操作 ...
- 关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法
3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可. #yum install libffi-devel -y#make install若在安装前移除了/usr/bin ...
- SVN提交错误及使用技巧
错误1: Some of selected resources were not added to version control. Some of selected resources were n ...