题解

枚举所有的回文串
注意,本质不同的回文串最多只有∣S∣|S|∣S∣个
在这些回文串中,有一些是满足要求的,我们对这些串打上标记
首先跑一个ManacherManacherManacher,然后枚举中间点,先从最大半径的回文串开始枚举,直到枚举的串之前出现过
在枚举的过程中,checkcheckcheck 每个回文串是否满足要求,满足的打上标记,然后是最关键的部分,建图
根据枚举的顺序建立有向图,其实就是增加一条链
上面这个过程,用 HashHashHash 判断重复,复杂度是线性的
为什么要这样做?
例如,枚举到某一个中间点,它枚举的回文串如图

其中,满足条件的为绿色底色
每次枚举一个中间点,实际上就是增加一条链
我们在新加入的链的顶端 +1+1+1 , 表明该顶点下面的所有儿子都将出现一次,其正确性是显然的
图全部建完之后,根据拓扑顺序,将每个顶点的值向儿子传递,同时保留自己的值
搞完之后,每个回文串出现的次数就已经确定了
最后一步,只关注之前打过标记的回文串,统计答案即可

代码

#include<bits/stdc++.h>
#define N 300010
#define M N<<0
#define INF 0x3f3f3f3f
#define eps 1e-10
// #define pi 3.141592653589793
#define mod 998244353
#define P 1000000007
#define LL long long
#define pb push_back
#define fi first
#define se second
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define bug(x) cerr<<#x<<"      :   "<<x<<endl
#define mem(x) memset(x,0,sizeof x)
#define sc(x) scanf("%lld",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace __gnu_pbds;
gp_hash_table<LL,int>mp;
char x[N],ss[N<<1];
struct node{int x,y;}w[N];
int la[N],in[N],q[N],r[N<<1],len[N],num[N],fg[N],ans[N],lin_t,str_t,slen,cnt;
typedef pair<int,int> pi;
pi v[N<<1];
LL p[N],pp[N],hs[N],sh[N],hss[N],shh[N];void pre(){slen=strlen(x+1); lin_t=cnt=0; mp.cl(); memset(ans,0,sizeof(int)*(slen+3));for(int i=1;i<=slen;i++) hs[i]=(hs[i-1]*1331+x[i])%mod,hss[i]=(hss[i-1]*9997+x[i])%P,sh[i]=(sh[i-1]*1331+x[slen-i+1])%mod,shh[i]=(shh[i-1]*9997+x[slen-i+1])%P;
}
inline void add(int x,int y){w[++lin_t]=node{y,la[x]};la[x]=lin_t;
}inline LL cal(LL *h,LL *hh,int x,int y){LL t1=(h[y]-h[x-1]*p[y-x+1]%mod+mod)%mod,t2=(hh[y]-hh[x-1]*pp[y-x+1]%P+P)%P;return t1<<30|t2;
}
int Init(){int len=strlen(x+1);ss[0]='$';ss[1]='#';int j=2;for (int i=1;i<=len;i++)ss[j++]=x[i],ss[j++]='#';ss[j]='\0';return j;
}
void Manacher(){int len=Init();int p,mx=0;for (int i=1;i<len;i++)    {if (i<mx) r[i]=min(r[2*p-i],mx-i);else r[i]=1;while (ss[i-r[i]]==ss[i+r[i]]) r[i]++;if (mx<i+r[i])p=i,mx=i+r[i];}str_t=0;for (int i=2;i<len;i++)    {if (ss[i]=='#' && r[i]==1) continue;int x=i/2-r[i]/2+1,y=i/2+r[i]/2-!(i&1);v[str_t++]=pi(x,y);}for(int i=0;i<len+3;i++) r[i]=0;
}inline bool check(int l,int r){if (cal(hs,hss,l,r)!=cal(sh,shh,slen-r+1,slen-l+1)) return false;if (cal(hs,hss,l,(l+r)>>1)!=cal(sh,shh,slen+1-((l+r)>>1),slen+1-l)) return false;return true;
}
namespace IO{ struct Ostream_fwrite{ #define BUF_SIZE 100000 #define OUT_SIZE 100000 char *buf,*p1,*pend; Ostream_fwrite(){buf=new char[BUF_SIZE];p1=buf;pend=buf+BUF_SIZE;} void out(char ch){ if (p1==pend){ fwrite(buf,1,BUF_SIZE,stdout);p1=buf; } *p1++=ch; } void print(int x){ static char s[15],*s1;s1=s; if (!x)*s1++='0';if (x<0)out('-'),x=-x; while(x)*s1++=x%10+'0',x/=10; while(s1--!=s)out(*s1); } void print(char *s){while (*s)out(*s++);} void flush(){if (p1!=buf){fwrite(buf,1,p1-buf,stdout);p1=buf;}}~Ostream_fwrite(){flush();} }Ostream; inline void print(int x){Ostream.print(x);} inline void print(char *s){Ostream.print(s);} inline void flush(){Ostream.flush();}
};
using namespace IO;
int main(){p[0]=1; pp[0]=1;for(int i=1;i<N;i++) p[i]=p[i-1]*1331%mod,pp[i]=pp[i-1]*9997%P;while(~scanf("%s",x+1)){pre();  Manacher();for(int i=0;i<str_t;i++){int l=v[i].fi,r=v[i].se,k=0;while(l<=r){LL tm=cal(hs,hss,l,r);int t=mp[tm];if(t){ q[++k]=t; break;}mp[tm]=++cnt;q[++k]=cnt;if (check(l,r)) fg[cnt]=1;len[cnt]=r-l+1;l++;r--;}if (k) num[q[1]]++;for(int i=1;i<k;i++) add(q[i],q[i+1]),in[q[i+1]]++;}int t=0,   h=0;for(int i=1;i<=cnt;i++) if (!in[i]) q[++t]=i;while(h<t){h++; int x=q[h];for(int j=la[x];j;j=w[j].y){num[w[j].x]+=num[x];in[w[j].x]--; if (!in[w[j].x]) q[++t]=w[j].x;}}for (int i=1;i<=cnt;i++) if (fg[i]) ans[len[i]]+=num[i];print(ans[1]);for (int i=2;i<=slen;i++) Ostream.out(' '),print(ans[i]); Ostream.out('\n');for(int i=1;i<=cnt;i++) in[i]=num[i]=la[i]=len[i]=fg[i]=0;}
}

2019杭电多校第一场 HDU 6599相关推荐

  1. 2019杭电多校第一场 Operation HDU - 6579

    题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...

  2. 2019年杭电多校第一场 1001题blank(DP)HDU6578

    2019年杭电多校第一场 1001题blank(DP)HDU6578 解决思路,开一个DP数组来存储0 1 2 3四个字符最后出现的位置,并且在DP中已经==排好序==. DP开四维,DP[i][j] ...

  3. 2022“杭电杯”中国大学生算法设计超级联赛 (1) 杭电多校第一场 2 3 4 5 8 12

    题目 1002 Dragon slayer 标程 1003 Backpack AC代码 1004 Ball AC代码 1008 Path AC代码 1009 Laser AC代码 1012 Alice ...

  4. HDU-6578 Blank(DP)2019暑假杭电多校第一场

    题意:一行有n个空格编号1~n; 每一个空格中填入0,1,2,3中的一个数字.且满足m个限制l,r,x:满足在区间[l,r]正好有x种不同的数字. 有多少种方法可以填充空格以满足所有条件? 思路:dp ...

  5. 杭电多校第一场第三题 Backpack(异或dp+bitset)

    问题描述 爱丽丝有一个容量背包m她现在想用一些物品填充! 爱丽丝有n项目,每个项目都有一个卷v我和值w我. 是否可以从n个项目中选择多个项目,以使背包完全装满(即体积的总和等于背包容量)?如果是这样, ...

  6. 2019杭电多校第二场1009 HDU6599:求本质不同的回文串长度及数量

    hdu6599:求本质不同的回文串长度及数量 hdu6599题意: manacher+后缀自动机+倍增 $O(nlog(n))$ manacher+后缀数组+二分 $O(nlog(n))$ 回文树(回 ...

  7. 2019杭电多校第九场 Rikka with Cake (hdu6681)

    题意:给出一个n * m的蛋糕,切 k 刀,每次从一个点(x,y)向 上下左右的一个方向切,问最后蛋糕被切成了几块 题解:显然,蛋糕的块数就是那么多线段的交点数 + 1.先离散,考虑向左切和向上切的, ...

  8. 2022 杭电多校 第一场

    文章目录 1011 Random 1012 Alice and Bob 1003 Backpack 1002 Dragon slayer 1009 Laser 1011 Random 签到 求一下期望 ...

  9. 2022杭电多校第一场

    A String 题意:求s串1-i(1 <i <n)子串的贡献,贡献为公共前后缀相交并且相交部分长度为k的倍数的数量 题解做法是用exkmp求出s串与所有后缀的LCP后,设LCP为x,那 ...

最新文章

  1. opencv3学习总结1
  2. part-time job
  3. 使用WebRTC开发Android Messenger:第3部分
  4. Spark报错: IOException: Bad connect ack with firstBadlink as xxx:500010
  5. 二叉树的BFS及DFS
  6. [POJ2559POJ3494] Largest Rectangle in a HistogramLargest Submatrix of All 1’s 「单调栈」
  7. 免费好用的录屏工具 —— EVCapture
  8. 天猫魔盘在 deepin-linux中的使用
  9. Win7/Win8如何配置jdk环境变量(配置java环境变量)
  10. 全国公共DNS服务器IP地址汇总
  11. oracle sla 设置文档,Oracle EBS SLA 详解(转)
  12. inkscape工具箱:选择和变换工具(快捷键F1)
  13. EasyUI的datagrid删除后一页所有数据不自动显示前页数据
  14. 利用python画钻石_用Python制作钻石ASCII艺术品
  15. HADOOP组成部分
  16. as 运行java 程序失败,为JBoss AS 7运行Java服务包装程序时出错
  17. 《概率论与数理统计》第四版 浙江大学第1-5章复习
  18. Imagenomic Portraiture 2.3 Key
  19. 单点登录(四):HTTPS相关知识
  20. 百度地图规划驾车线路DrivingRoute,自定义标注线路样式,禁止起始点途经点拖拽

热门文章

  1. 每个女生身边都有一个不是男朋友的男朋友
  2. 韩沉船多个客舱塞满遗体 高二复课仅剩13人
  3. JAVA计算机毕业设计疫苗药品批量扫码识别追溯系统计算机(附源码、数据库)
  4. PHP获取朋友圈封面,用这 3 招做朋友圈封面,绝对独一无二!| 领客专栏 · 微信时刻...
  5. Android在github上下载的开源项目出现这个问题
  6. 商标注册的材料和流程有哪些
  7. 解决电脑软件图标显示为空白图样
  8. 案例 | 标杆引领!人大金仓智绘数字金融
  9. gcc找不到Linux/in,已安装GCC,但找不到命令
  10. sc9832e camera 不能拍RAW图