zoukankan      html  css  js  c++  java
  • ural 1297 Palindrome

    求最长回文字串。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int maxn=2000+10;
     6 char s[maxn];
     7 int sa[maxn],t[maxn],t2[maxn],c[maxn];
     8 int rank[maxn],height[maxn];
     9 void build_sa(int n,int m)
    10 {
    11     int i,*x=t,*y=t2;
    12     for(i=0;i<m;i++) c[i]=0;
    13     for(i=0;i<n;i++) c[x[i]=s[i]]++;
    14     for(i=1;i<m;i++) c[i]+=c[i-1];
    15     for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
    16 
    17     for(int k=1;k<=n;k<<=1)
    18     {
    19         int p=0;
    20         for(i=n-k;i<n;i++) y[p++]=i;
    21         for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
    22 
    23         for(i=0;i<m;i++) c[i]=0;
    24         for(i=0;i<n;i++) c[x[y[i]]]++;
    25         for(i=1;i<m;i++) c[i]+=c[i-1];
    26         for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];
    27 
    28         swap(x,y);
    29         p=1;x[sa[0]]=0;
    30         for(i=1;i<n;i++)
    31             x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
    32         if(p>=n) break;
    33         m=p;
    34     }
    35 }
    36 void getHeight(int n)
    37 {
    38     int k=0,i;
    39     for(i=1;i<=n;i++) rank[sa[i]]=i;
    40     for(i=0;i<n;i++)
    41     {
    42         if(k) k--;
    43         int j=sa[rank[i]-1];
    44         while(s[i+k]==s[j+k]) k++;
    45         height[rank[i]]=k;
    46     }
    47 }
    48 int rmq(int a,int b)
    49 {
    50     a=rank[a],b=rank[b];
    51     if(a>b) swap(a,b);
    52     int minv=height[a+1];
    53     for(int i=a+1;i<=b;i++)
    54     if(height[i]<minv)
    55     minv=height[i];
    56     return minv;
    57 }
    58 int main()
    59 {
    60     while(gets(s))
    61     {
    62         int n=strlen(s);
    63         int len=n;
    64         s[n]='$';
    65         for(int i=0;i<n;i++)
    66             s[n+1+i]=s[n-1-i];
    67         n=2*n+1;
    68         s[n]='';
    69         build_sa(n+1,256);
    70         getHeight(n);
    71         int ans=0;
    72         int index=0;
    73         for(int i=0;i<len;i++)
    74         {
    75             int a=rmq(i,n-1-i);
    76             if(2*a-1>ans){ans=2*a-1;index=i+1-a;}
    77             int b=rmq(i,n-i);
    78             if(2*b>ans) { ans=2*b;index=i-b;}
    79         }
    80         s[index+ans]=0;
    81         printf("%s
    ",s+index);
    82     }
    83     return 0;
    84 }
  • 相关阅读:
    Java线程专题 3:java内存模型
    Java线程专题 2:synchronized理解
    Java线程专题 1:线程创建
    设计模式七大原则
    JVM 运行时数据区
    css_selector定位,比xpath速度快,语法简洁
    xpath绝对定位和相对定位
    selenium多种定位
    操作浏览器基本元素(不定时更新)
    爬取网页图片并且下载(1)
  • 原文地址:https://www.cnblogs.com/sooflow/p/3386976.html
Copyright © 2011-2022 走看看