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

poj 3882 Stammering Aliens

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

poj 3882 Stammering Aliens

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>using namespace std;#define MAXN 50000char s[MAXN];int rank[MAXN],sa[MAXN],wa[MAXN],wb[MAXN],high[MAXN],str[MAXN],wss[MAXN],wv[MAXN];int n,m;void calhigh(int *str,int *sa,int n){int i,j,k=0;for(i=1;i<=n;i++) rank[sa[i]]=i;for(i=0;i<n;high[rank[i++]]=k)for(k?k--:0,j=sa[rank[i]-1];str[i+k]==str[j+k];k++);}bool cmp(int *r,int a,int b,int l){return (r[a]==r[b]&&r[a+l]==r[b+l]);}void suffix(int *str,int *sa,int n,int m=256){int i,j,p,*x =wa,*y=wb;for(i=0;i<m;i++) wss[i]=0;for(i=0;i<n;i++) wss[x[i]=str[i]]++;for(i=1;i<m;i++) wss[i]+=wss[i-1];for(i=n-1;i>=0;i--) sa[--wss[x[i]]]=i;for(j=1,p=1;p<n;m=p,j*=2){p=0;for(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<n;i++) wv[i]=x[y[i]];for(i=0;i<m;i++) wss[i]=0;for(i=0;i<n;i++) wss[wv[i]]++;for(i=1;i<m;i++) wss[i]+=wss[i-1];for(i=n-1;i>=0;i--) sa[--wss[wv[i]]]=y[i];for(swap(x,y),x[sa[0]]=0,i=1,p=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}calhigh(str,sa,n-1);}int check(int lth){    int cnt=0,st=-1,tst=-1;    for(int i=2;i<=n;i++)    {        if(high[i]<lth)        { if(cnt>=m-1) {     st=max(st,tst);     tst=-1;     cnt=0; } else {     cnt=0;     tst=-1; }        }        else        { cnt++; tst=max(tst,max(sa[i-1],sa[i]));        }    }    if(cnt>=m-1) st=max(st,tst);    return st;}int main(){    while(~scanf("%d",&m)&&m)    {        scanf("%s",s);        n=strlen(s);        if(m==1)        { printf("%d 0n",n); continue;        }        for(int i=0;i<n;i++) str[i]=s[i];        str[n]=0;        suffix(str,sa,n+1);        int ed,maxs=0,tmp;        int l=0,r=n,mid;        while(l<r)        { mid=(l+r)>>1; if((tmp=check(mid))!=-1) {     l=mid+1;     maxs=mid;     ed=tmp; } else     r=mid;        }        if(maxs==0) printf("nonen");        else printf("%d %dn",maxs,ed);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380592.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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