您的位置:首页 > 其它

后缀数组 专题

2015-09-21 14:34 369 查看
国家队论文链接:链接:http://pan.baidu.com/s/1E1K4m 密码:cfog

(更新中)

poj 1743 Musical Theme http://poj.org/problem?id=1743 不可重叠重复字串

/**************************************************************
Problem:poj 1743
User: youmi
Language: C++
Result: Accepted
Time:219MS
Memory:1384K
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <ctime>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%I64d\n",a)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define rep_1(i,n) for(int i=n;i>=1;i--)
#define rep_0(i,n) for(int i=n-1;i>=0;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;
const int maxn=20010;

int wa[maxn],wb[maxn],wv[maxn],cnt[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[x[i]=r[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[x[i]]]=i;
for(j=1,p=1;p<n;j*=2,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<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[wv[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
return;
}
int rk[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{
int i,j,k=0;
for(i=1;i<=n;i++) rk[sa[i]]=i;
for(i=0;i<n;height[rk[i++]]=k)
for(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++);
return;
}
int r[maxn],sa[maxn];
int f[maxn];
int n;
bool work(int temp)
{
int l=oo,r=-1;
for(int i=2;i<=n;i++)
{
while(height[i]>=temp)
{
l=Min(l,Min(sa[i],sa[i-1]));
r=Max(r,Max(sa[i],sa[i-1]));
i++;
}
if(r-l>=temp)
return true;
else
{
l=oo,r=-1;
}
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
while(~sc(n)&&n)
{
rep0(i,n)
sc(f[i]);
for(int i=0;i<n-1;i++)
r[i]=f[i+1]-f[i]+88;
n--;
r
=0;
/**< for(int i=0;i<=n;i++)
printf("%d ",r[i]);
cout<<endl; */
da(r,sa,n+1,200);
calheight(r,sa,n);
int l=0,r=n+1;
int mid=0;
int ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(work(mid))
{
l=mid+1;
ans=mid;
}
else
r=mid-1;
}
if(ans>=4)
{
pt(ans+1);
}
else
printf("0\n");
}
return 0;
}


poj 3261 Milk Patterns http://poj.org/problem?id=3261 可重叠重复字串K次

/**************************************************************
Problem:poj 3261
User: youmi
Language: C++
Result: Accepted
Time:32MS
Memory:1480K
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <ctime>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%I64d\n",a)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define rep_1(i,n) for(int i=n;i>=1;i--)
#define rep_0(i,n) for(int i=n-1;i>=0;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;
const int maxn=20010;

int wa[maxn],wb[maxn],wv[maxn],cnt[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[x[i]=r[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[x[i]]]=i;
for(j=1,p=1;p<n;j*=2,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<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[wv[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
return;
}
int rk[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{
int i,j,k=0;
for(i=1;i<=n;i++) rk[sa[i]]=i;
for(i=0;i<n;height[rk[i++]]=k)
for(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++);
return;
}
int r[maxn],sa[maxn];
typedef struct
{
int v,p;
}node;
node ha[maxn];
bool small(const node a,const node b)
{
if(a.v==b.v)
return a.p<b.p;
return a.v<b.v;
}
int n,k;
void to_one()
{
sort(ha,ha+n,small);
int cnt=1;
r[ha[0].p]=cnt;
for(int i=1;i<n;i++)
{
if(ha[i].v!=ha[i-1].v)
r[ha[i].p]=++cnt;
else
r[ha[i].p]=r[ha[i-1].p];
}
}
bool work(int temp)
{
int tot;
for(int i=2;i<=n;i++)
{
tot=1;
while(height[i]>=temp)
{
tot++;
i++;
}
if(tot>=k)
return true;
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
while(~sc2(n,k))
{
rep0(i,n)
{
sc(ha[i].v);
ha[i].p=i;
}
to_one();
r
=0;
/**<for(int i=0;i<=n;i++)
printf("%d ",r[i]);
cout<<endl; */
da(r,sa,n+1,n+1);
calheight(r,sa,n);
int l=0,r=n+1;
int mid=0;
int ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(work(mid))
{
l=mid+1;
ans=mid;
}
else
r=mid-1;
}
printf("%d\n",ans);
}
return 0;
}


ural 1297 回文串 http://acm.timus.ru/problem.aspx?space=1&num=1297

/**************************************************************
Problem:ural 1297
User: youmi
Language: C++
Result: Accepted
Time:0.015    s
Memory:568 KB
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%I64d\n",a)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define rep_1(i,n) for(int i=n;i>=1;i--)
#define rep_0(i,n) for(int i=n-1;i>=0;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;

const int maxn=2010;

int wa[maxn],wb[maxn],wv[maxn],cnt[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[x[i]=r[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[x[i]]]=i;
for(j=1,p=1;p<n;j*=2,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<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[wv[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
return;
}
int rk[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{
int i,j,k=0;
for(i=1;i<=n;i++) rk[sa[i]]=i;
for(i=0;i<n;height[rk[i++]]=k)
for(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++);
return;
}

int r[maxn],sa[maxn];
char s[maxn];
int n;
int dp[maxn][15];
void  test()
{
rep1(i,n)
printf("%d ",dp[i][0]);
cout<<endl;
}
void RMQ()
{
int k=(int)(log(n*1.0)/log(2.0));
for(int i=1;i<=n;i++)
dp[i][0]=height[i];
for(int j=1;j<=k;j++)
for(int i=1;i+(1<<j)<=n;i++)
dp[i][j]=Min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int lcp(int a,int b)
{
int l=rk[a],r=rk[b];
if(l>r)
{
int t=l;
l=r;
r=t;
}
l++;
int k=(int )(log((r-l+1)*1.0)/log(2.0));
return Min(dp[l][k],dp[r-(1<<(k))+1][k]);
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scs(s))
{
int len=strlen(s);
n=0;
for(int i=0;i<len;i++)
r[n++]=s[i];
r[n++]=150;
for(int i=0;i<len;i++)
r[n++]=s[len-i-1];
r
=0;
da(r,sa,n+1,160);
calheight(r,sa,n);
RMQ();
int pos=0,ans=1;
int temp=0;
int m=(len<<1);
for(int i=0;i<len;i++)
{
temp=(lcp(i,m-i)<<1)-1;
if(temp>ans)
ans=temp,pos=i-(temp>>1);
temp=lcp(i,(m-i+1))<<1;
if(temp>ans)
ans=temp,pos=i-(temp>>1);
}
for(int i=pos;i<pos+ans;i++)
printf("%c",s[i]);
cout<<endl;
}
return 0;
}


poj 1226 Substrings http://poj.org/problem?id=1226

/**************************************************************
Problem:poj 1226
User: youmi
Language: C++
Result: Accepted
Time:0MS
Memory:1056K
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%I64d",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%I64d\n",a)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define rep_1(i,n) for(int i=n;i>=1;i--)
#define rep_0(i,n) for(int i=n-1;i>=0;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;

const int maxn=200100;
int wa[maxn],wb[maxn],wv[maxn],cnt[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[x[i]=r[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[x[i]]]=i;
for(j=1,p=1;p<n;j*=2,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<n;i++) wv[i]=x[y[i]];
for(i=0;i<m;i++) cnt[i]=0;
for(i=0;i<n;i++) cnt[wv[i]]++;
for(i=1;i<m;i++) cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--) sa[--cnt[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
return;
}
int rk[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{
int i,j,k=0;
for(i=1;i<=n;i++) rk[sa[i]]=i;
for(i=0;i<n;height[rk[i++]]=k)
for(k?k--:0,j=sa[rk[i]-1];r[i+k]==r[j+k];k++);
return;
}
char str[maxn];
int r[maxn],sa[maxn];
int who[maxn];
int vis[500];
int n,m;
bool check(int temp)
{
int tot=0;
zeros(vis);
for(int i=2;i<=n;i++)
{
if(height[i]<temp)
{
tot=0;
zeros(vis);
}
else
{
if(!vis[who[sa[i]]])
{
vis[who[sa[i]]]=1;
tot++;
}
if(!vis[who[sa[i-1]]])
{
vis[who[sa[i-1]]]=1;
tot++;
}
if(tot==m)
return true;
}
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
int T_T;
scanf("%d",&T_T);
for(int kase=1;kase<=T_T;kase++)
{
n=0;
int sp=150;
sc(m);
rep1(i,m)
{
scs(str);
int s1=strlen(str);
for(int j=0;str[j];j++)
{
who
=i;
r[n++]=str[j];
}
who
=sp;
r[n++]=sp++;
for(int j=0;str[j];j++)
{
who
=i;
r[n++]=str[s1-j-1];
}
who
=sp;
r[n++]=sp++;
}
r
=0;
da(r,sa,n+1,sp);
calheight(r,sa,n);
int l=0,r=strlen(str);
int mid=0,ans=0;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
l=mid+1;
ans=mid;
}
else
r=mid-1;
}
pt(ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: