首页 > 其他分享 >P6216 回文匹配

P6216 回文匹配

时间:2023-04-10 20:26:59浏览次数:55  
标签:P6216 匹配 前缀 int s2 sum s1 回文

回文匹配

/*
这里sum表示一维前缀和
sum(r-m+1) - sum(l-1)
sum(r-m+1-i) - sum(l-1+i)
所以应该是使用二位前缀和来进行处理
len/2也就是我半径需要的最小长度

有些难模拟,但是就是二维前缀和
最后统计答案的地方是真的绕

*/
#include <bits/stdc++.h>
using namespace std;
const int M=3e6+5;
#define int unsigned int

int ne[M];
void kmp(string s,int n) {
    for(int i=2,j=0;i<=n;i++) {
        while(j&&s[i]!=s[j+1])j=ne[j];
        if(s[i]==s[j+1])j++;
        ne[i]=j;
    }
}

int sum[M];//二维前缀和
void find(string s,int n,string t,int m) {
    for(int i=1,j=0;i<=n;i++) {
        while(j&&s[i]!=t[j+1])j=ne[j];
        if(s[i]==t[j+1])j++;
        if(j==m) {
            sum[i-j+1]=1;
            j=ne[j];
        }
    }
}

int p[M];
void manacher(string s,int n) {
    s.push_back('@');
    for(int i=1,mid=0,r=0;i<=n;i++) {
        if(i<=r)p[i]=min(p[2*mid-i],r-i+1);
        while(s[i-p[i]]==s[i+p[i]])p[i]++;
        if(i+p[i]-1>r)mid=i,r=i+p[i]-1;
    }
}

signed main() {
    int n,m;
    cin>>n>>m;
    string s1,s2;
    cin>>s1>>s2;
    s1=' '+s1,s2=' '+s2;
    kmp(s2,m);
    find(s1,n,s2,m); 
    for(int i=1;i<=n;i++)sum[i]+=sum[i-1];
    for(int i=1;i<=n;i++)sum[i]+=sum[i-1];//二维前缀和处理
    manacher(s1,n);
    int ans=0;
    for(int i=1;i<=n;i++) {
        if(2*p[i]-1<m)continue;
        int r=i+p[i]-1,l=i-p[i]+1;
        l--;r=r-m+1;
        int mid=(l+r)/2;
        //这里很绕呀
        ans+=sum[r]-sum[mid]-sum[((l+r)&1)?mid:mid-1]+sum[l==0?l:l-1];
    }
    cout<<ans<<endl;
    return 0;
}

标签:P6216,匹配,前缀,int,s2,sum,s1,回文
From: https://www.cnblogs.com/basicecho/p/17304151.html

相关文章

  • 回文树
    具体思想不多说structnode{intson[26];intlen;intfail;}t[N];intcnt=1,last=0;voidinit(){t[0].fail=1;t[1].len=-1;}intgetfail(intp,intr){while(r-t[p].len-1<0||s[r-t[p].len-1]!=s[r])p=t[p].fail;returnp;}intinsert(intx,int......
  • Rust语言 学习05 枚举与模式匹配
    一、定义枚举enumMessage{Quit,Move{x:i32,y:i32},Write(String),ChangeColor(i32,i32,i32),}fnmain(){letq=Message::Quit;letm=Message::Move{x:12,y:24};letw=Message::Write(String::from("Hello"));letc......
  • PAT Basic 1079. 延迟的回文数
    PATBasic1079.延迟的回文数1.题目描述:给定一个\(k+1\)位的正整数\(N\),写成\(a_k⋯a_1a_0\)的形式,其中对所有\(i\)有\(0≤a_i<10\)且\(a_k>0\)。\(N\)被称为一个回文数,当且仅当对所有\(i\)有\(a_i=a_{k−i}\)。零也被定义为一个回文数。非回文数也可以通过一......
  • 2217. 找到指定长度的回文数
    题目描述给了一个正整数k,表示长度是k的所有回文数字再给了和很多q,问第q小的数字是多少?f1数学关系+构造基本分析从q之间的相互关系考虑还是单独考虑某个q和结果的关系?后者长度是k的回文数字有啥特性?前一半数字是固定的,half=k+1>>2,str[num][:half]以上性质和q有啥......
  • 剑指 Offer 19. 正则表达式匹配
    题目链接:剑指Offer19.正则表达式匹配方法:动态规划解题思路详情见:逐行详细讲解,由浅入深,dp和递归两种思路代码classSolution{public:boolisMatch(strings,stringp){intn=s.size(),m=p.size();boolf[n+1][m+1];//f[i][j]代表s......
  • 模板匹配
    #include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"usingnamespacecv;//-----------------------------------【宏定义部分】--------------------------------------------//描述:定义一些辅助宏//---------------------------......
  • 链表的回文判断—Java实现
    对于这个题,主要是老是局限于方法内的变量,未想到借助外部变量辅助:具如下,不可用数除法,会溢出异常:即使是取最大的long也会溢出,常规方法不再赘述,具体以代码如下:1packageProblemSolve;23publicclassSolution5{4privateListNodefrontNode;5publicboolean......
  • 华为OD机试 字符匹配
    本期题目:字符匹配题目给你一个字符串数组每个字符串均由小写字母组成和一个字符规律由小写字母和.和*组成识别字符串数组中哪些字符串可以匹配到字符规律上 . 匹配任意单个字符 * 匹配0个或多个任意字符判断字符串是否匹配,是要涵盖整个字符串的而不是部分字符串输入......
  • HDU - 3081 Marriage Match II(二分图最大匹配 + 并查集)
    题目大意:有n个男生n个女生,现在要求将所有的男女配对,所有的男女都配对的话,算该轮游戏结束了。接着另一轮游戏开始,还是男女配对,但是配对的男女不能是之前配对过的。问这游戏能玩多少轮男女能配对的条件如下1.男女未曾吵架过。2.如果两个女的是朋友,那么另一个女的男朋友可以和......
  • 特征点检测与匹配
    特征点检测与匹配应用场景​ 图像搜索,如以图搜图(不是对整个图片进行处理的而是检测特征点进行搜索)​ 拼图游戏​ 拼图方法​ 寻找特征​ 特征是唯一的​ 特征可追踪的​ 能进行比较的​ 图像拼接,将两张有关联的图拼接到一起什么是特征​ 图像特......