首页 > 其他分享 >马拉车板子

马拉车板子

时间:2024-03-22 20:55:55浏览次数:24  
标签:std f1 string int 板子 -- && 拉车

#include<bits/stdc++.h>
#define int long long
using namespace std;
std::vector<int> manacher(std::string s) {
    std::string t = "#";
    for (auto c : s) {
        t += c;
        t += '#';
    }
    cout<<t<<"\n";
    int n = t.size();
    std::vector<int> r(n);
    for (int i = 0, j = 0; i < n; i++) {
        if (2 * j - i >= 0 && j + r[j] > i) {
            r[i] = std::min(r[2 * j - i], j + r[j] - i);
        }
        while (i - r[i] >= 0 && i + r[i] < n && t[i - r[i]] == t[i + r[i]]) {
            r[i] += 1;
        }
        if (i + r[i] > j + r[j]) {
            j = i;
        }
    }
    return r;
}
void solve(){
	int n,q;
	cin>>n>>q;
	string s;
	cin>>s;
	vector<int> f1(n), f2(n);
    for(int i=n-1;i>=0;i--)
    {
        f1[i]=i+1<n&&s[i]==s[i+1]?f1[i+1]:i;
        f2[i]=i+2<n&&s[i]==s[i+2]?f2[i+2]:i;
    }
	auto rad=manacher(s);
	for(auto c:rad){
		cout<<c<<" ";
	}
	while(q--){
		int l,r;
		cin>>l>>r;
		l--;r--;
		int len=r-l+1;
		int ans=0;
		if(f1[l]<r)
        {
            int m=(len-1)-(len-1)%2;
            ans+=(2+m)*(m/2)/2;
        }
        if(f2[l]+1<r||f2[l+1]+1<r)
        {
            int m=len-1-len%2;
            ans+=(3+m)*((m-1)/2)/2;
        }
         if(rad[l+r+1]<len) //说明并不对称 
        {
            ans+=len;
        }
        cout<<ans<<"\n";
	}
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

标签:std,f1,string,int,板子,--,&&,拉车
From: https://www.cnblogs.com/yufan1102/p/18090404

相关文章

  • 单调队列 维护区间最值(板子+两道练手)
    1.P1886滑动窗口/【模板】单调队列https://www.luogu.com.cn/problem/P1886板子题,传送门在上方//Problem://P1886滑动窗口/【模板】单调队列////Contest:Luogu//URL:https://www.luogu.com.cn/problem/P1886//MemoryLimit:500MB//TimeLimit:1......
  • 板子树杈
    高精度CodeconstintMAX=20000,BASE=10000;structNode{ intnumber[MAX+10],sign,length; Node(){ memset(number,0,sizeof(number)); sign=1,length=0; } voidClearZero(){ while(length>=1&&number[length]==0)--length......
  • 马拉车算法
    LuoguP3805【模板】manacher算法1//LuoguP3805【模板】manacher算法2#include<iostream>3#include<cstring>4#include<algorithm>5usingnamespacestd;67constintN=3e7;8chara[N],s[N];9intd[N];//回文半径函数1011voidget_......
  • tarjan 各类板子集合
    tarjan大板子(非讲解):1、普通缩点DGAvoidtarjan(intx){ dfn[x]=low[x]=++cntp; q.push(x);v[x]=1; for(inti=head[x];i;i=bi[i].next){ intj=bi[i].to; if(!dfn[j]){ tarjan(j); low[x]=min(low[x],low[j]); } elseif(v[j])low[x]=min(low[x],dfn[j]); }......
  • tarjan板子整理
    缩点stack<int>q;voidtarjan(intu){ pre[u]=low[u]=++cnt; q.push(u); vis[u]=1; for(inti=head[u];i;i=nxt[i]) { inty=to[i]; if(!pre[y]) { tarjan(y); low[u]=min(low[u],low[y]); } elseif(vis[y]) { low[u]=min(low[u],pre[y]);......
  • 数位dp板子(待补充)
    #include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<string>#include<string.h>#include<iomanip>#include<map>#include<queue>usingnamespacestd;typedeflonglongll;......
  • 多项式板子
    不想折磨自己了,以后都来这里贺。卷积:点击查看代码polyNTT(polya,intopt){intlen=a.size();For(i,0,len-1){if(i<r[i])swap(a[i],a[r[i]]);}for(intk=1;k<len;k<<=1){llwn=qpow(((opt==1)?g:inv_g),((mod-1)/(k<<1)));for(inti......
  • 板子
    例题题目描述某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用f(i,j)表示i,j之间连接的畅......
  • 带权并查集板子
    以一道区间和查询来说明板子如何使用1.merge的时候只需要维护两个根节点的距离,利用的是合并时题目给的信息2.find的时候更新维护是子节点到根的距离3.需要加一个查询函数,因为距离数组是开在结构体内部的。题目描述对于一个长度为\(N\)的整数数列\(A_{1},A_{2},\cdotsA_......
  • 多项式板子
    #include<bits/stdc++.h>#defineullunsignedlonglongusingnamespacestd;constintN=262150,mod=998244353,g=3,invg=(mod+1)/3,inv2=(mod+1)/2;intrev[N];ulla[N],b[N],w[N],inv[N];intqpow(inta,intb){ intans=1; while(b){ if(b&1){ an......