题解:

题目的意思就是在第一个串里找“s1s2s3”,第二个串里找“s4”,如上拼接后,是一个回文串,求方案数

可以发现,s1与s4是回文的,s2和s3是回文的,我们枚举s1的右端点,s1的长度乘以s2起始点为左边界的回文串的数量,累加就是答案。

现在分两部分,一是求s1,二是求以每个点为左边界的回文串的数量

一的话,就是求每个后缀匹配第二个串的LCP,可以用扩展kmp求得,也可以用hash加二分求得,二的话,用马拉车算法+前缀和就可以解决。

代码:

#include<bits/stdc++.h>
#define N 1000010
#define INF 0x3f3f3f3f
#define eps 1e-10
#define pi 3.141592653589793
#define mod 998244353
#define LL long long
#define pb push_back
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define mem(x) memset(x,0,sizeof x)
#define sc(x) scanf("%d",&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;int lens,lent;
char s[N<<1],t[N],ss[N<<1];
int d[N],r[N<<1];int Init()
{int len = strlen(s+1);ss[0] = '$';ss[1] = '#';int j = 2;for (int i = 1; i <= len; i++)ss[j++] = s[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];}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);d[x]++;d[(x+y)/2+1]--;}
}LL p1[N],p2[N],h1[N],h2[N],h3[N],h4[N];const LL m1=998244353;
const LL m2=100000007;LL spy(int x,int y)
{LL t1=(h1[lens-x+1]-(LL)h1[lens-y]*p1[y-x+1]%m1+m1)%m1;LL t2=(h2[lens-x+1]-(LL)h2[lens-y]*p2[y-x+1]%m2+m2)%m2;return t1<<31|t2;
}LL spyer(int y)
{return h3[y]<<31|h4[y];
}int main()
{p1[0]=p2[0]=1;for (int i=1;i<N;i++) p1[i]=p1[i-1]*377%m1,p2[i]=p2[i-1]*377%m2;while(~scanf("%s%s",s+1,t+1)){mem(d);lens=strlen(s+1); lent=strlen(t+1);for (int i=1;i<=lens;i++) d[i]=0;Manacher();for (int i=1;i<=lens;i++) d[i]+=d[i-1];strcpy(ss+1,s+1);reverse(s+1,s+lens+1);for (int i=1;i<=lens;i++)h1[i]=(h1[i-1]*377+s[i])%m1,h2[i]=(h2[i-1]*377+s[i])%m2;for (int i=1;i<=lent;i++)h3[i]=(h3[i-1]*377+t[i])%m1,h4[i]=(h4[i-1]*377+t[i])%m2;LL ans=0;for (int i=1;i<lens;i++){if (ss[i]!=t[1]) continue;int l=1,r=i>lent?lent:i;LL k=1;while(l<=r){int m=l+r>>1;if (spy(i-m+1,i)==spyer(m))k=m,l=m+1;else r=m-1;}ans+=k*d[i+1];}printf("%lld\n",ans);}
}

ICPC 2018 南京 Mediocre String Problem相关推荐

  1. 2018ICPC 南京 Mediocre String Problem 扩展KMP + Manacher

    题目大意为计算 S S S 串的子串 s s s 串和 T T T 中的前缀 t t t 串拼起来是回文串的种数的总贡献,要求 s s s 串长度大于 t t t, s + t s+t s+t 是回文 ...

  2. 2018 ICPC 南京 M. Mediocre String Problem(ExKMP + Manacher / ExKMP+回文树)

    2018 ICPC 南京 全文见:https://blog.csdn.net/qq_43461168/article/details/112796538 M. Mediocre String Prob ...

  3. Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢Grunt大佬的细心讲解)...

    layout: post title: Mediocre String Problem (2018南京M,回文+LCP 3×3=9种做法 %%%千年好题 感谢"Grunt"大佬的细 ...

  4. ACM-ICPC2018南京赛区 Mediocre String Problem

    Mediocre String Problem 题解: 很容易想到将第一个串反过来,然后对于s串的每个位置可以求出t的前缀和它匹配了多少个(EXKMP 或者 二分+hash). 然后剩下的就是要处理以 ...

  5. Problem M. Mediocre String Problem(Z 函数 + PAM)

    Problem M. Mediocre String Problem 给定两个串s,ts, ts,t,要求有多少不同的三元组(i,j,k)(i, j, k)(i,j,k),满足: 1≤i≤j≤∣s∣1 ...

  6. M - Mediocre String Problem( 扩展KMP + Manacher + 差分 )

    M - Mediocre String Problem( 扩展KMP + Manacher + 差分 ) 题意:给出一个串S,和一个串T. 要求 从S串中取一个子串,后面接上T串的一个前缀 组成一个结 ...

  7. Problem M. Mediocre String Problem

    Problem M. Mediocre String Problem(马拉车+拓展KMP) 题意:给一个S串一个T串, 问有多少个F(i, j, k),F(i, j, k) 的定义是S串选个下标i~j ...

  8. Mediocre String Problem(马拉车+扩展KMP)

    文章目录 [Mediocre String Problem](https://codeforces.com/gym/101981) 题目大意 解题思路 代码 Mediocre String Probl ...

  9. Gym_101981M Mediocre String Problem(exkmp+manachar)

    Mediocre String Problem time limit per test:1 seconds memory limit per test:256 megabytes Problem De ...

最新文章

  1. CListCtrl创建方法
  2. 文本显示变量_Axure9实操教程10-变量
  3. JAVA共通関数--文字列に空白を追加する
  4. HTML5中的websocket实现直播
  5. spring框架文档学习(包会)
  6. idea使用dababase tools时导出db2建表语句,索引显示错误
  7. [IDEA中SSM整合,前端页面jsp] tomcat一开始访问jsp页面就报404错误
  8. python目标跟踪精度曲线图_Python+opencv3.4+Kalman滤波在视频中跟踪绘制运动目标,Pythonopencv34kalman,卡尔曼滤波,实现,物体,追踪,和,轨迹...
  9. KVO 和 KVC 的区别?
  10. ECharts 经常会修改到的一些样式配置
  11. 鸿蒙os系统作用,华为再发新版鸿蒙OS系统!新增超级终端功能:可媲美iOS系统...
  12. 楼对面的男士夏天就光膀子,请问大家,男士真的都爱光膀子吗?
  13. 大数据思维与数据驱动
  14. dubbo源码解析-服务暴露原理
  15. lwj_C#_集合listT
  16. excel两个指标相关性分析_excel两组数据相关性分析
  17. thinkpad选择启动项_联系ThinkPad笔记本怎么设置第一启动项
  18. mysql rownum写法_mysql应用之类似oracle rownum写法
  19. Flutter 开发错误集合二
  20. 利用Instrumentation单元测试模块控制安卓手机进行各项操作(微信)

热门文章

  1. 中国牙齿修复材料行业市场供需与战略研究报告
  2. 宏工科技领掀锂电匀浆效率风暴
  3. 美团点评学龄前儿童营养午餐公益项目落地湖南湘西
  4. Python字典:闻道集合集字典,字典长长值对键。
  5. 计算机二级Python真题(八)
  6. 怎样还原转义的html,非常简单的 html 转义与反转义
  7. Windows下 python bleson 安装使用记录
  8. 小米的无米之炊:陷入研发无力的囚徒困境
  9. 公共云和私有云之间的区别
  10. ​2019年排名Top 100的Java类库——在分析了30073份源码之后得出的结论