zoukankan      html  css  js  c++  java
  • 【POJ 3623】 Best Cow Line, Gold (后缀数组)

    【题意】

      

    【分析】

      后缀数组水题,嗯,不认真看输出像我一样就会被坑。。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<queue>
     7 using namespace std;
     8 #define Maxn 300010
     9 
    10 char ss[Maxn],s[Maxn*2];
    11 int a[Maxn*2];
    12 int len,n;
    13 
    14 int Rs[Maxn*2],rk[Maxn*2],sa[Maxn*2],wr[Maxn*2],y[Maxn*2];
    15 void get_sa(int m)
    16 {
    17     for(int i=1;i<=len;i++) rk[i]=a[i];
    18     for(int i=0;i<=m;i++) Rs[i]=0;
    19     for(int i=1;i<=len;i++) Rs[rk[i]]++;
    20     for(int i=1;i<=m;i++) Rs[i]+=Rs[i-1];
    21     for(int i=len;i>=1;i--) sa[Rs[rk[i]]--]=i;
    22     
    23     int p=0,ln=1;
    24     while(p<len)
    25     {
    26         int k=0;
    27         for(int i=len-ln+1;i<=len;i++) y[++k]=i;
    28         for(int i=1;i<=len;i++) if(sa[i]>ln) y[++k]=sa[i]-ln;
    29         for(int i=1;i<=len;i++) wr[i]=rk[y[i]];
    30         
    31         for(int i=0;i<=m;i++) Rs[i]=0;
    32         for(int i=1;i<=len;i++) Rs[wr[i]]++;
    33         for(int i=1;i<=m;i++) Rs[i]+=Rs[i-1];
    34         for(int i=len;i>=1;i--) sa[Rs[wr[i]]--]=y[i];
    35 
    36         p=1;
    37         for(int i=1;i<=len;i++) wr[i]=rk[i];
    38         for(int i=len+1;i<=len+len;i++) wr[i]=0;
    39         rk[sa[1]]=1;
    40         for(int i=2;i<=len;i++)
    41         {
    42             if(wr[sa[i]]!=wr[sa[i-1]]||wr[sa[i]+ln]!=wr[sa[i-1]+ln]) p++;
    43             rk[sa[i]]=p;
    44         }
    45         m=p,ln*=2;
    46     }
    47 }
    48 
    49 /*int height[Maxn];
    50 void get_height()
    51 {
    52     int k=0;
    53     for(int i=1;i<=len;i++) if(sa[i]!=1)
    54     {
    55         int j=sa[rk[i]-1];
    56         if(k) k--;
    57         while(a[i+k]==a[j+k]) k++;
    58         height[rk[i]]=k;
    59     }
    60 }*/
    61 
    62 int ans[Maxn];
    63 
    64 int main()
    65 {
    66     scanf("%d",&n);
    67     for(int i=1;i<=n;i++)
    68     {
    69         scanf("%s",s);
    70         a[i]=s[0]-'A'+1;
    71     }
    72     // ans[n+1]=28;
    73     len=2*n;
    74     for(int i=1;i<=n;i++) a[len-i+1]=a[i];
    75     get_sa(30);
    76     // get_height();
    77     int l=1,r=n;
    78     for(int i=1;i<=n;i++)
    79     {
    80         if(rk[l]<=rk[len-r+1]) ans[i]=a[l++];
    81         else ans[i]=a[r--];
    82     }
    83     for(int i=1;i<=n;i++)
    84     {
    85         printf("%c",ans[i]+'A'-1);
    86         if(i%80==0) printf("
    ");
    87     }
    88     printf("
    ");
    89     return 0; 
    90 }
    View Code

    坑爹的poj改数据规模也不说一声。。

    2016-11-03 09:52:49

  • 相关阅读:
    linux内核中GNU C和标准C的区别
    linux内核中GNU C和标准C的区别
    Getting start with dbus in systemd (02)
    Getting start with dbus in systemd (01)
    Getting start with dbus in systemd (03)
    物理内存相关的三个数据结构
    数据类型对应字节数(32位,64位 int 占字节数)
    Linux kernel 内存
    共模电感的原理以及使用情况
    [原创]DC-DC输出端加电压会烧毁
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6025392.html
Copyright © 2011-2022 走看看