后缀数组 poj. 1743. Musial Theme

题意感觉有点难懂。但就是问你,给你一个数字串,然后问有没有相同子串(不能重合且长度大于五),或者不用相同的,全部加上一个或减去一个数之后相等的就好。
先是二分长度,然后通过height数组来判断是否可行

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include<string>
using namespace std;
const int  maxn =4e4+10;
int n;
struct Suffix
{
    int s[maxn];
    int SA[maxn],ranked[maxn],height[maxn];
    int x[maxn],y[maxn],buc[maxn],len,m;
    void init(int *str)
    {
        //len=strlen(str);
        len=n;
        for(int i=0;i<len;i++) s[i]=(int)str[i];
        m=200;//
    }
    void build()
    {
        for (int i = 0; i < m; i++) buc[i] = 0; // buc 是一个桶
        for (int i = 0; i < len; i++) buc[x[i] = s[i]]++;
        for (int i = 1; i < m; i++)
             buc[i] += buc[i - 1];
        for (int i = len - 1; i >= 0; i--)
            SA[--buc[x[i]]] = i;
        for (int k = 1; k <= len; k <<= 1) { // k 倍增
          int p = 0;
          //对第二关键字排序,y[i]:第i大的第二关键字是谁
          // 后缀 len - k 及之后的所有后缀第二关键字最小。为0
          for (int i = len - 1; i >= len - k; i--)
            y[p++] = i;
          for (int i = 0; i < len; i++)
                if (SA[i] >= k)
                    y[p++] = SA[i] - k;
         //总体来排个序,求出SA
          for (int i = 0; i < m; i++) buc[i] = 0;
          for (int i = 0; i < len; i++)
                buc[x[y[i]]]++;
          for (int i = 1; i < m; i++)
                buc[i] += buc[i - 1];
          for (int i = len - 1; i >= 0; i--)
                SA[--buc[x[y[i]]]] = y[i];
          swap(x, y);
          p = 1; x[SA[0]] = 0;
          // 重新计算每个一元的名次。则x数组里存的是总体的顺序
          for (int i = 1; i < len; i++) {
            if (y[SA[i - 1]] == y[SA[i]] && y[SA[i - 1] + k] == y[SA[i] + k])
              x[SA[i]] = p - 1;
            else x[SA[i]] = p++;
          }
          if (p >= len) break; // 每个后缀的名次已经完全不同,不需要继续倍增
              m = p; // 更新名次的最大值。
        }
    }
    void LCP()
    {
        for(int i=0;i<len;i++)
            ranked[SA[i]]=i;
        int k=0;
        for(int i=0;i<len;i++)
        {
            if(ranked[i]==0) {height[0]=0;continue;}
            if(k) k--;
            int j=SA[ranked[i]-1];
            while(s[i+k]==s[j+k]&&i+k<len&&j+k<len) k++;
            height[ranked[i]]=k;
        }
    }
 /*  int LCS(char *s1)
    {
        int l=strlen(s1);
        s1[l]=' ';
        scanf("%s",s1+l+1);
        init(s1);
        build();
        LCP();
        int ans=0;
        for(int i=1;i<len;i++)
        if((SA[i-1]<l&&SA[i]>l)||(SA[i-1]>l&&SA[i]<l))
                ans=max(ans,height[i]);
        return ans;
    }*/
};
Suffix a;
int ok(int mid)
{
    int i=1;
    while(1){
    for(;i<n;i++)
        if(a.height[i]>=mid)
            break;
    if(i>=n) break;
    int minn=a.SA[i-1];
    int maxx=a.SA[i-1];
    while(i<n&&a.height[i]>=mid)
    {
        minn=min(a.SA[i],minn);
        maxx=max(a.SA[i],maxx);
        i++;
    }
    if(maxx-minn>=mid) return 1;
    }
    return 0;

}
int num[maxn];
int str[maxn];
int main()
{
    while(scanf("%d",&n)!=EOF&&n)
    {
       memset(str,0,sizeof(str));
      memset(num,0,sizeof(num));
        for(int i=0;i<n;i++)
            scanf("%d",&num[i]);
        if(n<10) printf("0\n");
        else
        {
            for(int i=1;i<n;i++)
                str[i-1]=num[i]-num[i-1]+100;
             n--;
         //   str[n-1]=0;
            a.init(str);
            a.build();
            a.LCP();
            int l=4,r=n/2,res=0;
            while(l<=r)
            {
                int mid=l+(r-l)/2;
                if(ok(mid)){
                    res=mid;
                    l=mid+1;
                }
                else r=mid-1;
            }
            if(res>=4)
            printf("%d\n",res+1);
            else printf("0\n");
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值