码迷,mamicode.com
首页 > 编程语言 > 详细

后缀数组 专题

时间:2015-09-21 15:36:47      阅读:177      评论:0      收藏: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[n]=i;
                r[n++]=str[j];
            }
            who[n]=sp;
            r[n++]=sp++;
            for(int j=0;str[j];j++)
            {
                who[n]=i;
                r[n++]=str[s1-j-1];
            }
            who[n]=sp;
            r[n++]=sp++;
        }
        r[n]=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;
}

 

后缀数组 专题

标签:

原文地址:http://www.cnblogs.com/youmi/p/4826111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!