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;
    }
    


  • 相关阅读:
    (二)shell中的变量
    (一)shell脚本入门
    java的动态代理机制详解
    docker学习
    一、Spring Boot 入门
    如何高效的利用博客园?
    CMake入门指南
    TortoiseSVN安装使用
    TortoiseSVN配置和使用教程
    脑电采集 地电极和参考电极的作用和区别
  • 原文地址:https://www.cnblogs.com/pangblog/p/3253800.html
Copyright © 2011-2022 走看看