题意:给出一个由小写字母组成的长为n的字符串S,定义他的子串【L,R】为周驿东串当且仅当【L,R】为回文串且【L,(L+R)/2】为回文串

求i=【1,n】 所有长度为i的周驿东串的个数

n<=3e5

思路:PAM把所有回文串找出来,记录一下在原串S中的位置和长度,最后check每个结点是不是周驿东串

check部分可以正反两次哈希,N=3e5应该要双哈

我是用manacher预处理出每个位置为中心的回文串的最大长度,check就直接看一下(l+mid)/2这个位置的长度有没有r-mid+1

std里还判了右半部分,迷惑行为

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 700010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
ll INF=1ll<<;
ll inf=5e13;
int dx[]={-,,,};
int dy[]={,,-,}; char s[N];
int ans[N],aid[N],p[N],a[N],ID; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void manacher(char *ch,int len)
{
rep(i,,len*+) a[i]=-;
int n=; a[]=; a[]=;
rep(i,,len)
{
a[++n]=ch[i]-'a'; aid[i]=n;
a[++n]=;
}
a[++n]=;
rep(i,,n) p[i]=;
int mx=,id=;
rep(i,,n-)
{
if(mx>i) p[i]=min(p[*id-i],mx-i);
else p[i]=;
while(a[i+p[i]]==a[i-p[i]]) p[i]++;
if(p[i]+i>mx)
{
mx=p[i]+i;
id=i;
}
}
rep(i,,n-) p[i]--;
} int isok(int l,int r)
{
int mid=(l+r)>>;
int t=(p[(aid[l]+aid[mid])>>]>=mid-l+);
return t;
} struct pam
{
int q,p,cnt[N],num[N],f[N],len[N],id[N],ch[N][]; pam(){} void init()
{
rep(i,,ID)
{
len[i]=f[i]=num[i]=id[i]=cnt[i]=;
rep(j,,) ch[i][j]=;
}
ID=;
f[]=f[]=; len[]=-;
} void add(int x,int n)
{
while(s[n-len[p]-]!=s[n]) p=f[p];
if(!ch[p][x])
{
int q=++ID,k=f[p];
len[q]=len[p]+;
while(s[n-len[k]-]!=s[n]) k=f[k];
f[q]=ch[k][x];
ch[p][x]=q;
num[q]=num[f[q]]+;
}
p=ch[p][x];
cnt[p]++;
id[p]=n;
} void solve()
{
per(i,ID,) cnt[f[i]]+=cnt[i];
rep(i,,ID)
if(len[i]>)
ans[len[i]]+=isok(id[i]-len[i]+,id[i])*cnt[i];
}
}pam; int main()
{
while(scanf("%s",s+)!=EOF)
{
int n=strlen(s+);
pam.init();
rep(i,,n) ans[i]=;
rep(i,,n) pam.add(s[i]-'a',i);
manacher(s,n);
pam.solve();
rep(i,,n-) printf("%d ",ans[i]);
printf("%d\n",ans[n]);
} return ;
}

【HDOJ6599】I Love Palindrome String(PAM,manacher)的更多相关文章

  1. 【BZOJ3676】 [Apio2014]回文串(SAM,manacher)

    传送门 BZOJ 洛谷 Solution 考虑我们每找到一个回文串就更新一次答案,跑个SAM,这样子复杂度是爆炸的. 接下来的就是优化: 我们可以倍增跳直到跳不了,最后的siz就是出现次数. 没了?没 ...

  2. 【BZOJ4316】小C的独立集(仙人掌,动态规划)

    [BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...

  3. 【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)

    [BZOJ5302][HAOI2018]奇怪的背包(动态规划,容斥原理) 题面 BZOJ 洛谷 题解 为啥泥萌做法和我都不一样啊 一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\ ...

  4. 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)

    [BZOJ2000][HNOI2000]取石头游戏(贪心,博弈论) 题面 BZOJ 洛谷 题解 这题好神仙啊,窝不会QaQ. 假装一下只有三个元素\(a_{i-1},a_i,a_{i+1}\),并且满 ...

  5. 【BZOJ5019】[SNOI2017]遗失的答案(FWT,动态规划)

    [BZOJ5019][SNOI2017]遗失的答案(FWT,动态规划) 题面 BZOJ 题解 发现\(10^8\)最多分解为不超过\(8\)个本质不同质数的乘积. 而\(gcd\)和\(lcm\)分别 ...

  6. 【BZOJ1413】[ZJOI2009]取石子游戏(博弈论,动态规划)

    [BZOJ1413][ZJOI2009]取石子游戏(博弈论,动态规划) 题面 BZOJ 洛谷 题解 神仙题.jpg.\(ZJOI\)是真的神仙. 发现\(SG\)函数等东西完全找不到规律,无奈只能翻题 ...

  7. 【BZOJ1019】[SHOI2008]汉诺塔(数论,搜索)

    [BZOJ1019][SHOI2008]汉诺塔(数论,搜索) 题面 BZOJ 洛谷 题解 首先汉诺塔问题的递推式我们大力猜想一下一定会是形如\(f_i=kf_{i-1}+b\)的形式. 这个鬼玩意不好 ...

  8. 【LeetCode】9、Palindrome Number(回文数)

    题目等级:Easy 题目描述: Determine whether an integer is a palindrome. An integer is a palindrome when it rea ...

  9. 【codeforces】Bear and Three Balls(排序,去重)

    Bear and Three Balls Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

随机推荐

  1. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站

    环境准备 三台主机: 一台主机部署jenkins和作为ansible的管理主机 一台主机部署gitlab和ansible的节点1 一台主机为ansible的节点2 防火墙和apache服务关闭 第一步 ...

  2. ping, telnet, tcping 命令使用及对比

    1. ping 命令 ping 命令只能检查 IP 的连通性或网络连接速度,无法具体到某个端口. ping 命令使用 ICMP 协议,跟 IP 协议属于同一层次(网络层).ping 命令在每次发数据包 ...

  3. EL表达式(三)自定义 EL 表达式

    自定义EL函数(静态方法): 编写步骤: 1.编写一个Java类,提供一个静态方法 import java.util.List; public class GetLength { public sta ...

  4. 牛客 打印N个数组整体最大的Top K

    题目链接:https://www.nowcoder.com/practice/5727b69bf80541c98c06ab90cf4c509e?tpId=101&tqId=33102& ...

  5. upc组队赛17 Bits Reverse【暴力枚举】

    Bits Reverse 题目链接 题目描述 Now given two integers x and y, you can reverse every consecutive three bits ...

  6. Java IO(1)

    IO这一部分内容还是比较多的,对于基础的枯燥但是又重要的内容还是将它记下来比较好. 关于File类 Ø File类直接继承与Object类,File类描述了文件本身的一些属性,File类用来获取或者处 ...

  7. Django 无法通过request.POST.get()获取数据的问题

    原来是contentType为application/json时,Django不支持request.POST.get(),但可以通过request.body来获取string类型的参数: data = ...

  8. 同步GitHub上fork的项目

    最近在做“Python练习册,每天一个小程序”,fork了项目并贡献自己写的代码,项目还有其他人在贡献代码,每天都会更新,这就涉及到了自己fork的项目与原项目的同步更新问题,下面就是我最常用的方法. ...

  9. C++学习笔记(一)--基础

    1.遵循标准C++,主函数类型为int,成功返回值为0,异常返回默认为-1. 2.使用系统函数库,必须加上 using namespace std,因为C++的标准库函数是在命名空间std中: 3.输 ...

  10. Struts2之获取ServletAPI

    1.通过ServletActionContext类 //获取request对象 HttpServletRequest request = ServletActionContext.getRequest ...