• 最长公共子序列(稀疏序列)nlogn解法


    首先这种做法只能针对稀疏序列,

    比如这种情况:

    abc abacabc

    会输出5

    ,,,,就比较尴尬,

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define lli long long int 
     7 using namespace std;
     8 const int MAXN=4001;
     9 const int maxn=0x3f;
    10 void read(int &n)
    11 {
    12     char c='+';int x=0;bool flag=0;
    13     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
    14     while(c>='0'&&c<='9')
    15     x=(x<<1)+(x<<3)+c-48,c=getchar();
    16     flag==1?n=-x:n=x;
    17 }
    18 int a[MAXN];
    19 int b[MAXN];
    20 int n;
    21 int c[MAXN];// 预处理后的数组
    22 int tot=0;
    23 int dp[MAXN]; 
    24 char aa[MAXN];
    25 char bb[MAXN];
    26 void work()
    27 {
    28         memset(dp,0x3f,sizeof(dp));
    29         tot=0;
    30         memset(c,0,sizeof(c));
    31         memset(a,0,sizeof(a));
    32         memset(b,0,sizeof(b));
    33         for(int i=0;i<strlen(aa);i++)
    34             a[i+1]=aa[i]-48;
    35     
    36         for(int i=0;i<strlen(bb);i++)
    37             b[i+1]=bb[i]-48;
    38 
    39         for(int i=1;i<=strlen(bb);i++)
    40         {
    41             for(int j=strlen(aa);j>=1;j--)
    42                 if(b[i]==a[j])
    43                     c[++tot]=j;
    44         }
    45         //for(int i=1;i<=tot;i++)
    46         //    printf("%d ",c[i]);
    47         for(int i=1;i<=tot;i++)
    48         {
    49             int p=upper_bound(dp+1,dp+tot+1,c[i])-dp;
    50             if(dp[p]==c[i])
    51                 continue;
    52             dp[p]=c[i];
    53         }
    54 }
    55 int  main()
    56 {
    57     //ios::sync_with_stdio(false);
    58     while(~scanf("%s %s",aa,bb))
    59     {
    60         work();
    61         for(int i=1;i<=tot+1;i++)
    62         {
    63             if(dp[i]>=maxn)
    64             {
    65                 printf("%d
    ",i-1);
    66                 break;
    67             }
    68         }
    69     }
    70     
    71     return 0;
    72 }
  • 相关阅读:
    Android开发新手学习总结(六)——android开发目录结构【图文版】
    Android开发新手学习总结(一)——使用Android Studio搭建Android集成开发环境
    62个Android Studio小技巧合集
    Android Studio 入门指南
    Unity操作
    Unity的安装和破解
    pb数据窗口设置操作
    Roll A Ball
    c实现旋转数列
    用循环添加多行、多列视图
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/7197365.html
Copyright © 2020-2023  润新知