zoukankan      html  css  js  c++  java
  • Long Long Message POJ

    Long Long Message

    POJ - 2774

    题意:求两个串的最长公共字串。

    用特殊符号连接两个字符串,后缀数组。

    枚举height,如果sa[i]和sa[i-1]分别属于不同的串,则更新最大值。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn = 200010;
     7 char s[maxn];
     8 int sa[maxn],t1[maxn],t2[maxn],c[maxn];
     9 int rank[maxn],height[maxn];
    10 
    11 
    12 void build_sa(int n, int m){
    13     int i, *x = t1, *y = t2;
    14     for(i = 0; i < m; i++) c[i] = 0;
    15     for(i = 0; i < n; i++) c[x[i] = s[i]]++;
    16     for(i = 1; i < m; i++) c[i] += c[i-1];
    17     for(i = n-1; i >= 0; i--) sa[--c[x[i]]] = i;
    18     for(int k = 1; k <= n; k <<= 1){
    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         for(i = 0; i < m; i++) c[i] = 0;
    23         for(i = 0; i < n; i++) c[x[y[i]]]++;
    24         for(i = 1; i < m; i++) c[i] += c[i-1];
    25         for(i = n-1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];
    26         swap(x,y);
    27         p=1;
    28         x[sa[0]]=0;
    29         for(i = 1; i < n; i++) 
    30           x[sa[i]]= y[sa[i]]==y[sa[i-1]] && y[sa[i]+k]==y[sa[i-1]+k] ? p-1 : p++;
    31         if(p >= n) break;
    32         m=p;
    33     }
    34 }
    35 void getHeight(int n){
    36     int i, j, k=0;
    37     for(i = 0; i <= n; i++) rank[sa[i]] = i;
    38     for(i = 0; i < n; i++) {
    39         if(k) k--;
    40         j = sa[rank[i]-1];
    41         while(s[i+k]==s[j+k]) k++;
    42         height[rank[i]] = k;
    43     }
    44 }
    45 
    46 int main(){
    47     while(scanf("%s",s)!=EOF){
    48         int n=strlen(s);
    49         int l1=n;
    50         s[n]='#';
    51         scanf("%s",s+n+1);
    52         n=strlen(s);
    53     //    cout<<s<<endl;
    54         build_sa(n+1,256);
    55         getHeight(n);
    56         int ans=0;
    57         for(int i = 1; i < n; i++){
    58             if(sa[i]<l1&&sa[i-1]>l1 || sa[i]>l1&&sa[i-1]<l1){
    59                 ans=max(ans,height[i]);
    60             }
    61         }
    62         printf("%d
    ",ans);
    63     }
    64     return 0;
    65 }
    View Code
  • 相关阅读:
    具有快表的地址变换机构
    npm更换淘宝镜像
    内存扩充技术
    内存管理的概念
    内存的基础知识
    102. 二叉树的层序遍历
    104. 二叉树的最大深度
    206. 反转链表
    mysql 多字段查询,全局搜素
    java 处理html转义字符
  • 原文地址:https://www.cnblogs.com/yijiull/p/7520315.html
Copyright © 2011-2022 走看看