当前位置: 首页 > news >正文

Manacher模板,kmp,扩展kmp,最小表示法模板

// Manacher算法,很好用。

char
s[2*N]; //储存临时串 int save[2*N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); int cnt=0; for(int i=0;i<len;i++) { s[cnt++]='#'; s[cnt++]=tmp[i]; } s[cnt++]='#'; memset(save,0,sizeof(save)); int a=0,p=0; int mx=1; for(int i=1;i<cnt-1;i++) { if(i>=p) { int num=1; while(i+num<cnt&&i-num>=0&&s[i+num]==s[i-num]) { num++; } p=i+num-1; //能到达的最远位置 a=i; save[i]=num-1; //从这个位置出发最长的回文 if(save[i]==0) continue; if(s[i]=='#') { if(2*((save[i]-1)/2 +1)>mx) mx=2*((save[i]-1)/2+1); } else { if(2*(save[i]/2)+1>mx) mx=2*(save[i]/2)+1; } } else { int j=2*a-i; if( i+save[j] < p) { save[i]=save[j]; if(save[i]==0) continue; if(s[i]=='#') { if(2*((save[i]-1)/2 +1)>mx) mx=2*((save[i]-1)/2+1); } else { if(2*(save[i]/2)+1>mx) mx=2*(save[i]/2)+1; } } else { int k=2*i-p; while(p+1<cnt&&k-1>=0&&s[p+1]==s[k-1]) { p++; k--; } a=i; save[i]=p-i; if(save[i]==0) continue; if(s[i]=='#') { if(2*((save[i]-1)/2 +1)>mx) mx=2*((save[i]-1)/2+1); } else { if(2*(save[i]/2)+1>mx) mx=2*(save[i]/2)+1; } } } } return mx; }

 

kmp,扩展kmp

// 感觉kmp可以理解。 

#define N 100010
int s[N];
int next[N];
int t[N];

int main()
{
    //freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
    //freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%d",s+i);
        for(int i=0;i<m;i++)
            scanf("%d",t+i);
    ///求next
        int j=0;
        next[0]=0;
        for(int i=1;i<m;i++)
        {
            while(j!=0&&t[j]!=t[i]) j=next[j-1]; 
            if(t[j]==t[i]) j++;
            next[i]=j;
        }

    / 

        j=0;
        int ans=-1;
        for(int i=0;i<n;i++)
        {
            while(j!=0&&s[i]!=t[j]) j=next[j-1];
            if(s[i]==t[j]) j++;
            if(j==m)
            {
                ans=i+1-m+1;
                break;
            }
        }

    ///
        if(ans==-1)
            printf("-1\n");
        else
            printf("%d\n",ans);
    }
    return 0;
}


// 扩展kmp。
#defien N 100100

int next[N],sum[N];// sum用来记录

void build(char s[])
{
    memset(next,0,sizeof(next));
    int p=0,a=0;
    next[0]=len;
    for(int i=1;i<len;i++)
    {
        if(i+next[i-a]-1<p)
        {
            next[i]=next[i-a];
        }
        else
        {
            int k=p-i;
            while(p+1<len && s[p+1]==s[k+1])
            {
                p++; k++;
            }
            p=max(p,i);
            next[i]=k+1;
            a=i;
        }
    }
}

void extend_kmp(char s[],char t[])//求从s到t上的最大前缀
{
    memset(sum,0,sizeof(sum));
    int p=-1,a=0;
    for(int i=0;i<len;i++)
    {
        if(i+next[i-a]-1<p)
        {
            sum[i]=next[i-a];
        }
        else
        {
            int k=p-i;
            while(p+1<len && s[p+1]==t[k+1])
            {
                p++; k++;
            }
            p=max(p,i);
            sum[i]=k+1;
            a=i;
        }
    }
}

 

最小表示法

int mistr(char s[],int len)  //输入一串字符,返回最小表示法的起始位置
{
    int i=0,j=1,k=0;
    while(i<len&&j<len&&k<len)
    {
        if(s[i+k]==s[j+k])
        {
            k++;
        }
        else
        {
            if(s[i+k] > s[j+k]) i=i+k+1;
            if(s[i+k] < s[j+k]) j=j+k+1;
            k=0;
            if(i==j) j++;
        }
    }
    return min(i,j);
}

 

转载于:https://www.cnblogs.com/chenhuan001/p/3226717.html

相关文章:

  • linux修改文件读写执行权限命令chmod
  • right-click an action, missing Go to slot
  • 零售门店促销创新的八个思路
  • 华为C8812获取对system分区的读写权限
  • C#路径的相关操作
  • 第八章 对象和数组
  • 用 HTML 编写博客栏目
  • 指针的本质
  • intent intent-filter
  • [HDU] 1054 Strategic Game 入门树形DP
  • JS Invalid Label ,eval错误解决方法
  • A2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密)
  • boost库在工作(37)网络UDP服务端之七
  • H面试程序(0):字符串一些常用函数的实现
  • 不容易系列之(4)——考新郎[HDU2049]
  • express.js的介绍及使用
  • java第三方包学习之lombok
  • java中具有继承关系的类及其对象初始化顺序
  • Koa2 之文件上传下载
  • leetcode讲解--894. All Possible Full Binary Trees
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • miaov-React 最佳入门
  • ViewService——一种保证客户端与服务端同步的方法
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 服务器之间,相同帐号,实现免密钥登录
  • 京东美团研发面经
  • 配置 PM2 实现代码自动发布
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 收藏好这篇,别再只说“数据劫持”了
  • 一些关于Rust在2019年的思考
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #define用法
  • #QT(智能家居界面-界面切换)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $().each和$.each的区别
  • (11)MATLAB PCA+SVM 人脸识别
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (九)One-Wire总线-DS18B20
  • (四) 虚拟摄像头vivi体验
  • (转)socket Aio demo
  • ****Linux下Mysql的安装和配置
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Core跨平台微服务学习资源
  • .NET 分布式技术比较
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net快速开发框架源码分享
  • /etc/sudoer文件配置简析
  • @staticmethod和@classmethod的作用与区别