栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3693 Maximum repetition s...

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3693 Maximum repetition s...

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int N=100005;char s[N];int n,sa[N],height[N],rank[N],tmp[N],top[N];void makesa(){    int i,j,len,na;    na=max(256,n);    memset(top,0,sizeof(top));    for(i=0;i<n;i++)top[rank[i]=(s[i]&0xff)]++;    for(i=1;i<na;i++)top[i]+=top[i-1];    for(int i=0;i<n;i++)sa[--top[rank[i]]]=i;    for(len=1;len<n;len<<=1)    {        for(i=0;i<n;i++)        { j=sa[i]-len; if(j<0)j+=n; tmp[top[rank[j]]++]=j;        }        sa[tmp[top[0]=0]]=j=0;        for(i=1;i<n;i++)        { if(rank[tmp[i]]!=rank[tmp[i-1]]||rank[tmp[i]+len]!=rank[tmp[i-1]+len])     top[++j]=i; sa[tmp[i]]=j;        }        memcpy(rank,sa,sizeof(int)*n);        memcpy(sa,tmp,sizeof(int)*n);        if(j>=n-1) break;    }}void lcp(){    int i,j,k;    for(j=rank[height[i=k=0]=0];i<n-1;i++,k++)    {        while(k>=0&&s[i]!=s[sa[j-1]+k]) height[j]=k--,j=rank[sa[j]+1];    }}int st[40][N];void initrmq(){    int i,j,k,sk;    for(i=0;i<n;i++)st[0][i]=height[i];    for(i=1,k=2;k<n;i++,k<<=1)    {        for(j=0,sk=(k>>1);j<n;j++,sk++)        { st[i][j]=st[i-1][j]; if(sk<n&&st[i][j]>st[i-1][sk]) {     st[i][j]=st[i-1][sk]; }        }    }}int lg[N];int query(int x,int y){    if(x>y)        swap(x,y);    x++;    int b=lg[y-x+1];    return min(st[b][x],st[b][y-(1<<b)+1]);}struct data{    int len,r,pos;    data(){}    data(int _len,int _r,int _pos){len=_len;r=_r;pos=_pos;}    bool operator<(const data ≠)const    {        if(r!=ne.r) return r<ne.r;        return rank[pos]>rank[ne.pos];    }};int main(){    int ca=0;    lg[0]=-1;    for(int i=1;i<N;i++){        lg[i]=(i&(i-1))?lg[i-1]:(lg[i-1]+1);    }    while(gets(s),strcmp(s,"#")!=0)    {        n=strlen(s)+1;        makesa();lcp();initrmq();        int a,b;        data ans(1,1,0);        for(int ll=1;ll<n;ll++)        { for(int i=0;i+ll<n;i+=ll) {     int t,r,k=query(rank[i],rank[i+ll]);     r=k/ll+1;     t=i-ll+k%ll;     if(t>=0&&k%ll!=0&&query(rank[t],rank[t+ll])>=k)     {         r++;         while(t>=0&&t>i-ll&&query(rank[t],rank[t+ll])>=k)         {  data tp(ll,r,t);  if(ans<tp)      ans=tp;  t--;         }     }     else     {         data tp(ll,r,i);         if(ans<tp)  ans=tp;     } }        }        s[ans.pos+ans.len*ans.r]='';        printf("Case %d: %sn",++ca,s+ans.pos);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379144.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号