zoukankan      html  css  js  c++  java
  • 【FOJ】2075 Substring

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 using namespace std;
      5 #define MAXN 100010
      6 #define MAXM 20
      7 char s[MAXN];
      8 int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];
      9 int sa[MAXN],height[MAXN],rk[MAXN];
     10 int st[MAXM][MAXN],log2[MAXN];
     11 inline bool cmp(int *r,int a,int b,int L)
     12 {
     13     return r[a]==r[b]&&r[a+L]==r[b+L];
     14 }
     15 void SA(int n,int m)
     16 {
     17     int i,j,p,*x=wa,*y=wb,*t;
     18     for(i=0;i<m;i++)
     19         ws[i]=0;
     20     for(i=0;i<n;i++)
     21         ws[x[i]=s[i]]++;
     22     for(i=1;i<m;i++)
     23         ws[i]+=ws[i-1];
     24     for(i=n-1;i>=0;i--)
     25         sa[--ws[x[i]]]=i;
     26     for(j=p=1;p<n;j<<=1,m=p)
     27     {
     28         for(p=0,i=n-j;i<n;i++)
     29             y[p++]=i;
     30         for(i=0;i<n;i++)
     31         {
     32             if(sa[i]>=j)
     33                 y[p++]=sa[i]-j;
     34         }
     35         for(i=0;i<m;i++)
     36             ws[i]=0;
     37         for(i=0;i<n;i++)
     38             ws[wv[i]=x[y[i]]]++;
     39         for(i=1;i<m;i++)
     40             ws[i]+=ws[i-1];
     41         for(i=n-1;i>=0;i--)
     42             sa[--ws[wv[i]]]=y[i];
     43         for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)
     44             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
     45     }
     46 }
     47 void Height(int n)
     48 {
     49     int i,j,k;
     50     for(i=1;i<=n;i++)
     51         rk[sa[i]]=i;
     52     for(i=k=0;i<n;height[rk[i++]]=k)
     53         for(k?k--:0,j=sa[rk[i]-1];s[i+k]==s[j+k];k++);
     54 }
     55 void Init()
     56 {
     57     int i,k;
     58     log2[1]=0;
     59     for(i=k=2;i<MAXN;i++)
     60     {
     61         if(i>=(1<<k))
     62             k++;
     63         log2[i]=k-1;
     64     }
     65 }
     66 void ST(int n)
     67 {
     68     int i,j;
     69     for(i=1;i<=n;i++)
     70         st[0][i]=height[i];
     71     for(j=1;(1<<j)<=n;j++)
     72     {
     73         for(i=1;i+(1<<j)<=n+1;i++)
     74             st[j][i]=min(st[j-1][i],st[j-1][i+(1<<(j-1))]);
     75     }
     76 }
     77 int LCP(int i,int j)
     78 {
     79     i=rk[i];
     80     j=rk[j];
     81     if(i>j)
     82         swap(i,j);
     83     i++;
     84     int k=log2[j-i+1];
     85     return min(st[k][i],st[k][j-(1<<k)+1]);
     86 }
     87 void DoIt(int n,int k)
     88 {
     89     int i,j,t;
     90     for(i=1;i<=n;i++)
     91     {
     92         if(i+k-1>n)
     93             break;
     94         t=LCP(sa[i],sa[i+k-1]);
     95         if(t>height[i]&&(i+k>n||i+k<=n&&t>height[i+k]))
     96         {
     97             for(j=sa[i];j<t+sa[i];j++)
     98                 putchar(s[j]);
     99             putchar('\n');
    100             return;
    101         }
    102     }
    103     puts("impossible");
    104 }
    105 int main()
    106 {
    107     int k,n,i;
    108     Init();
    109     while(~scanf("%d %s",&k,s))
    110     {
    111         n=strlen(s);
    112         SA(n+1,'z'+1);
    113         Height(n);
    114         ST(n);
    115         DoIt(n,k);
    116     }
    117     return 0;
    118 }
  • 相关阅读:
    Springboot + Caffeine 实现本地缓存
    springboot + mybatis-plus + sharding-jdbc 实现单库分表
    工厂模式+策略模式 使用
    JAVA 金额自动除以100,精确到分
    spring aop + 自定义注解实现本地缓存
    springboot 使用 retry重试机制
    Mybatis-plus 自动注入公共字段
    docker 安装kafka
    ES 实现聚合分页
    Authentication token manipulation error 及 mongodb WiredTigerLAS.wt 文件过大问题
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2586900.html
Copyright © 2011-2022 走看看