zoukankan      html  css  js  c++  java
  • poj 1226

    跟3294比较类似,但是不需要输出具体的串,比较简单,只要把串反转连接上去解法就一样了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=1e5+9;
    int r[maxn];
    int c[maxn];
    char a[1111];
    int n,m;
    int *rank,height[maxn],sa[maxn];
    int wx[maxn],wy[maxn],cnt[maxn];
    inline bool 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 n,int m)
    {
        r[n+1]=0;
        int i,l,p,*x=wx,*y=wy,*t;
        memset(cnt,0,sizeof(int)*(m+1));
        for(int i=1;i<=n;i++) cnt[x[i]=r[i]]++;
        for(int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
        for(int i=n;i>=1;i--) sa[cnt[x[i]]--]=i;
        for(l=1,p=1;p<n;l<<=1,m=p)
        {
            for(p=1,i=n-l+1;i<=n;i++) y[p++]=i;
            for(i=1;i<=n;i++)
            if(sa[i]>l)
            y[p++]=sa[i]-l;
            memset(cnt,0,sizeof(int)*(m+1));
            for(i=1;i<=n;i++) cnt[x[i]]++;
            for(i=1;i<=m;i++) cnt[i]+=cnt[i-1];
            for(i=n;i>=1;i--) sa[cnt[x[y[i]]]--]=y[i];
            for(t=x,x=y,y=t,p=1,x[sa[1]]=1,i=2;i<=n;i++)
            x[sa[i]]=cmp(y,sa[i-1],sa[i],l)?p:++p;
        }
        rank=x;
        int j,k=0;
    	for(i=1;i<=n;height[rank[i++]]=k)
    	for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
    	return;
    }
    
    
    bool fla[111];
    bool chk(int ret)
    {
        for(int i=2;i<=n;i++)
        if(height[i]>=ret)
        {
            int j=i+1;
            while(height[j]>=ret) j++;
            j--;
            memset(fla,0,sizeof(fla));
            for(int k=i-1;k<=j;k++)
            fla[c[sa[k]]]=1;
            int cnt=0;
            for(int k=1;k<=m;k++)
            cnt+=fla[k];
            if(cnt==m) return true;
        }
        return false;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            n=0;
            int ret;
            scanf("%d",&m);
            for(int i=1;i<=m;i++)
            {
                scanf("%s",a+1);
                ret=strlen(a+1);
                for(int j=1;j<=ret;j++)
                r[n+j]=a[j];
                n+=ret;
                r[++n]=280+i*2-1;
                for(int j=1;j<=ret;j++)
                r[n+(ret-j+1)]=a[j];
                n+=ret;
                r[++n]=280+i*2;
                for(int j=n-ret-ret-2+1;j<=n;j++)
                c[j]=i;
            }
            da(r,n,500);
            int st=0,ed=111,mid;
            while(st<ed)
            {
                mid=st+ed+1>>1;
                if(chk(mid)) st=mid;
                else ed=mid-1;
            }
            printf("%d
    ",st);
        }
        return 0;
    }
    


  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/pangblog/p/3253800.html
Copyright © 2011-2022 走看看