程序博客网 > 阿里云oss设置http头

HDU 5558 后缀数组

来源:互联网 发布: 阿里云oss设置http头 编辑:程序博客网 时间:2024/06/21 02:53

点击打开链接

题意:从第一个字符开始,找到一个从0到当前位置i之前的与i开始的字符串的最长匹配长度及位置,长度相同时,要位置小的,若存在,位置+最长长度,否则+1

思路:15年合肥的现场题目,据说牌子发不完了,这道题的题目数据变弱后才可以将牌子发光,HDU的应该也是弱数据的版本,但是也不太好处理,看了大牛的思路才自己照着样子写了写,大牛的做法,其实我就是完全的按照神犇的做法写的,大家可以去看他的博客,思路就是对于当前的位置i,它的排名找出来,然后它的前边和后边是可能有与其有匹配情况的,也只有这个情况才能匹配,然后找这两部分就行,如果已经找到的长度是K,那么当下一个长度不够K时,跳出即可,这样看i与i+1的匹配长度为L,i+1与i+2的匹配长度为L1,那么i与i+2的匹配长度一定是两者取小的那个,所以再找到一个比K小的,后面都是比K小的,这样就降低了复杂度,但是还是不知道能不能过了现场的题目,然后先是预处理一下左右可到的区间,这都是在高度数组上进行的,然后跑一遍找就可以了,写到这发现其实不予处理也可以,因为那个小于K那个已经很优化了,刚刚测试一下,也过了,慢了一点而已

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int MAXN=1000010;int wa[MAXN],wb[MAXN],wv[MAXN],ww[MAXN];int sa[MAXN],lcp[MAXN],Rank[MAXN],rank1[MAXN],vis[MAXN];char str[MAXN];inline bool cmp(int *r,int a,int b,int len){    return r[a]==r[b]&&r[a+len]==r[b+len];} void construct_sa(int n,int m){     int i,j,p,*x=wa,*y=wb,*t;n++;     for(i=0;i<m;i++) ww[i]=0;     for(i=0;i<n;i++) ww[x[i]=str[i]]++;     for(i=1;i<m;i++) ww[i]+=ww[i-1];     for(i=n-1;i>=0;i--) sa[--ww[x[i]]]=i;     for(j=p=1;p<n;j<<=1,m=p){         for(p=0,i=n-j;i<n;i++)            y[p++]=i;         for(i=0;i<n;i++){             if(sa[i]>=j)                 y[p++]=sa[i]-j;         }         for(i=0;i<m;i++) ww[i]=0;         for(i=0;i<n;i++) ww[wv[i]=x[y[i]]]++;         for(i=1;i<m;i++) ww[i]+=ww[i-1];         for(i=n-1;i>=0;i--) sa[--ww[wv[i]]]=y[i];         for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;     }}void construct_lcp(int n){    for(int i=0;i<=n;i++) rank1[sa[i]]=i;    int h=0;    lcp[0]=0;    for(int i=0;i<n;i++){        int j=sa[rank1[i]-1];        if(h>0) h--;        for(;j+h<n&&i+h<n;h++) if(str[i+h]!=str[j+h]) break;        lcp[rank1[i]-1]=h;    }}int fa[MAXN],son[MAXN];int main(){    int T,cas=1;    scanf("%d",&T);    while(T--){        scanf("%s",str);        int len=strlen(str);        memset(fa,0,sizeof(fa));        memset(son,0,sizeof(son));        construct_sa(len,300);sa[len+1]=inf;        construct_lcp(len);        for(int i=1;i<=len;i++){            if(lcp[i-1]==0) fa[i]=i;            else fa[i]=fa[i-1];        }        for(int i=len;i>0;i--){            if(lcp[i]==0||i==len) son[i]=i;            else son[i]=son[i+1];        }        printf("Case #%d:\n",cas++);        for(int i=0;i<len;){            if(i==0){                printf("-1 %d\n",(int)str[i]);                i++;continue;            }            int min1=0,pos=inf,fen=rank1[i];            int max1;            max1=lcp[fen];            for(int j=fen;j<=son[fen];j++){                max1=min(max1,lcp[j]);                if(max1<min1) break;                if(sa[j+1]>=i) continue;                if(max1>min1){                    min1=max1;pos=sa[j+1];                }else if(max1==min1&&pos>sa[j+1]) pos=sa[j+1];            }            if(fen-1>=fa[fen]) max1=lcp[fen-1];            for(int j=fen-1;j>=fa[fen];j--){                max1=min(max1,lcp[j]);                if(max1<min1) break;                if(sa[j]>=i) continue;                if(max1>min1){                    min1=max1;pos=sa[j];                }else if(max1==min1&&pos>sa[j]) pos=sa[j];            }            if(min1==0){                printf("-1 %d\n",(int)str[i]);                i++;            }else{                printf("%d %d\n",min1,pos);                i+=min1;            }        }    }    return 0;}

0 0
  • HDU 5558 后缀数组
  • HDU 5558 (后缀数组 二分 RMQ)
  • hdu 4416 后缀数组
  • hdu 4436 后缀数组
  • hdu 3518后缀数组
  • 后缀数组 HDU 4436
  • hdu 3518 后缀数组
  • HDU 3518 后缀数组
  • hdu 4436 后缀数组
  • HDU 4416 后缀数组
  • hdu 2492后缀数组
  • hdu 4029 后缀数组
  • hdu 4416 后缀数组
  • hdu 4691 后缀数组
  • hdu 3518 后缀数组
  • hdu 4622 后缀数组
  • hdu 5442 (后缀数组)
  • HDU 3518 后缀数组
  • Hibernate:No row with the given identifier exists
  • 22.使用MAT对Dump文件进行分析实战
  • ZooKeeper 基本API使用
  • 毛玻璃效果就是这么唯美
  • oracle表分区详解
  • HDU 5558 后缀数组
  • Beta 版软件如何成功发布App
  • 安卓获取电池信息
  • mysql处理海量数据时的一些优化查询速度方法
  • NYOJ 1057 寻找最大数(三)
  • 【马仔创业记】一只猴子的创业独白(5)心理咨询行业痛点分析
  • SpringMVC-处理请求参数
  • JDK各个版本的新特性jdk1.5-jdk8
  • 正则表达式 判断手机号码是否合法
阿里云oss设置http头 阿里云oss设置http头
原创粉丝点击
热门IT博客
php简单管理系统 php简单管理系统
火炬之光2mac版本更新 火炬之光2mac版本更新
mac os x cdr镜像下载
加qq群软件
linux sprintf
简述sql注入攻击效果
d5600和d7100 知乎
医院网络部工作职责
prada高仿包淘宝
淘宝店铺自动回复
电脑怎么截图淘宝客服
手机办公软件表格的
张学友 深海知乎
unity3d人物模型动作
linux init work
淘宝考试管制刀具
并发测试软件
心动网络2018校招
美国量化投资数据分析
sql常用查询语句
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上排牙齿突出 哺乳期能弄牙齿吗 牙齿反颌 兔子的牙齿 兔子牙齿太长怎么办 兔子有牙齿吗 乌牙 兔子牙齿断了 兔子有几颗牙齿 兔子的牙齿图片 兔子有多少颗牙齿 兔子有几个牙齿 门牙中间有小牙 功夫兔与菜包狗 狗兔 功夫兔和菜包狗全集 细狗撵兔 兔狗 兔和狗相配吗 狗撵兔 兔从狗窦入 男狗女兔 狗兔鱼 狗和兔相配吗 狗十三免费观看达达兔 兔尽狗烹 兔和狗 狗撵兔顺口溜 兔从狗窦入下一句 狗跟兔合不合 兔狗家装网 菜包狗和功夫兔全集 功夫兔与菜包狗100集 功夫兔和菜包狗全集100集 兔狗科技 兔狗成语 逮兔狗 宠物狗大全 狗与狗 兔狲 兔狲凶残到什么程度

深圳SEO优化公司民治seo东莞百搜标王福田seo网站优化吉祥设计网站横岗网站搭建沙井百度爱采购南山网站推广工具南山网站设计南山关键词排名观澜seo网站推广盐田关键词按天扣费平湖seo塘坑优秀网站设计南联关键词按天收费深圳网站开发塘坑网站优化按天计费横岗网站优化排名坪地设计公司网站广州网站优化推广平湖关键词按天计费布吉网站搜索优化龙岗网站建设设计南山网站设计大鹏网站优化按天计费塘坑设计公司网站坂田网页制作大芬网站开发惠州网站排名优化塘坑网站优化排名龙岗百姓网标王歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化