首页 > 其他分享 >【题解】回文匹配

【题解】回文匹配

时间:2022-10-14 15:00:50浏览次数:92  
标签:匹配 int 题解 sum mid long summ include 回文

题目传送门:【洛谷】回文匹配

算法1:

有贡献的子串的左端标记1,每次找最大的回文,在左端能遍历的范围内,计算离两边端哪个最近,其距离即贡献值。
\(\sum \limits_{i=l}^{r}\)\(a_i\times(i-l+1)+\sum \limits_{i=l}^{r}a_i\times(r-i+1)\)

通过观察我们只需要维护\(a_i和a_i\times i\)即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 3100010;
int n,m,val[N],p[N],ne[N],sum[N],summ[N];
char s[N],str[N],pp[N];

void init()
{
	for(int i=2,j=0;i<=m;i++)
	{
		while(j&&pp[i]!=pp[j+1]) j=ne[j];
		if(pp[i]==pp[j+1]) j++;	
		ne[i]=j;
	}
}
void kmp()
{
	
	for(int i=1,j=0;i<=n;i++)
	{
		while(j&&s[i]!=pp[j+1]) j=ne[j];
		if(s[i]==pp[j+1]) j++;
		if(j==m)
		{
			j=ne[j];
			val[i-m+1]=1;
		}
	}
}
void manacher()
{
	int mid=0,mr=0;
	for(int i=1;i<=n;i++)
	{
		if(i<mr) p[i]=min(p[mid*2-i],mr-i);
		else p[i]=0;
		while(s[i+p[i]+1]==s[i-p[i]-1]&&i-p[i]-1>=1&&i+p[i]+1<=n)
		{
		    ++p[i];
		} 
		if(i+p[i]>mr)
		{
		    mr=i+p[i];
		    mid=i;
		}
 	}
}
void solve()
{
	long long ans=0;
	for(int i=1;i<=n;i++) 
	{
	    sum[i]=sum[i-1]+val[i];
	    summ[i]=summ[i-1]+val[i]*i;	
	}
	int mid,l,r;
	for(int i=1;i<=n;i++)
	{
		l=i-p[i],r=i+p[i]-m+1;
		if(l>r) continue;
		mid=(l+r)>>1;
		ans+=summ[mid]-summ[l-1]-(sum[mid]-sum[l-1])*(l-1);
	
		if(mid!=r) ans+=(sum[r]-sum[mid])*(r+1)- (summ[r]-summ[mid]);//如果在后半段
		
	}
	long long  mod=pow(2,32);
        printf("%lld\n",ans%mod);	
}

int main()
{
	cin>>n>>m;
	cin>>s+1>>pp+1;
	init();
	manacher();

	kmp();
	solve();
	
	
	return 0;
}

标签:匹配,int,题解,sum,mid,long,summ,include,回文
From: https://www.cnblogs.com/watasky/p/16791601.html

相关文章

  • CF1693F I Might Be Wrong 题解
    感觉是一个比较套路的题目。思路很容易就可以胡出一个贪心策略。每一次操作都选一个从前面开始最长的\(0,1\)数量相同的序列进行操作。看一眼好像样例都能过。可以......
  • [题解]Easy/OSU!
    概率期望题有的可以处理部分的概率,比如说这两个题就可以处理增加值。拿这个题举例子因为\((x+1)^2=x^2+2\timesx+1\)所以我们只需要维护\(x\)的期望,之后就可以推出......
  • python2 | python3 | 文本清洗正则匹配
    python3写的清洗文本代码在python2用不了,会出现各种编码问题,经过痛苦的一晚上加班终于搞完了,记录一下。python2defclean_text(content):"""去除话题词,链接,@用户,图......
  • Error: could not open 'D:\Environment\java\jre1.8\lib\amd64\jvm.cfg'问题解
    环境变量均已配置成功,但输入java-version时弹出错误Error:couldnotopen'D:\Environment\java\jre1.8\lib\amd64\jvm.cfg'解决办法:按照系统变量里的这个路径找到jav......
  • 正则表达式匹配
    ([\s\S]*)drop(\s+.*)正则表达式代码功能.匹配任意1个字符(除了\n)[]匹配[]中列举的字符\d匹配数字,即0-9\D匹配非数字,即不是数字\s匹配空白,即空格,tab键\S匹配非空......
  • 洛谷 题解 P1572 计算分数
    题目描述Csh被老妈关在家里做分数计算题,但显然他不愿意坐这么多复杂的计算。况且在家门口还有Xxq在等着他去一起看电影。为了尽快地能去陪Xxq看电影,他把剩下的计算题......
  • [联合省选2021] 宝石 题解(详细解密)
    [省选联考2021]宝石给定一棵\(n\)个点的树,每个点上有一颗种类是\(w_i\)的宝石,宝石种类共\(m\)种,有一个收集器,按照\(P_1,P_2,...,P_c\)的先后顺序收集宝石(就是说......
  • python使用xml.dom.minidom写xml节点属性会自动排序问题解决
    1.背景及问题一个xml文件,过滤掉部分节点,生成新的xml文件,但是生成后,发现节点的属性顺序变化了,根据key的字母信息排了序。如原始信息:<stringtypename="time_type"length......
  • P7077 [CSP-S2020] 函数调用 题解
    首先考虑没有3操作的情况,显然有线段树的\(O(n\logn)\)做法,但是另外有一种\(O(n)\)做法:因为2操作是全局乘所以我们完全可以统计出全局乘了多少然后直接往\(a_i\)......
  • QT QSS样式部分控件生效问题解决记录
    在窗口复杂的时候,建议设置QSS函数setStyleSheet放到 ui->setupUi(this);之前,比如:MainWindow{QFilefile(":/css/TeachingNeedleCard_style.qss");file.op......