• COJ 0885 LCS???


    LCS???
    难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述
    输入两个字符串A、B,输出他们的最长连续公共子串长度。
    输入
    第一行为一个字符串A。
    第二行为一个字符串B。
    输出
    输出他们的最长连续公共子串长度。
    输入示例
    ababab
    bababbabb
    输出示例
    5
    其他说明
    1<=|A|,|B|<=100000
    A、B均由小写字母a或b组成。

    题解:快看这里还有一道LCS快去捉了它!

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=100000+10,sig=2;
    11 struct SAM{
    12     struct node{
    13         int len;node*p,*tx[sig];
    14     }sam[maxn<<1],*nodecnt,*root,*x;
    15     void init(){nodecnt=sam;return;}
    16     node*newnode(int len=0){node*t=nodecnt++;t->len=len;return t;}
    17     void extend(int pos,char ch){
    18         int c=ch-'a';node*p=x;x=newnode(pos+1);
    19         for(;p&&!p->tx[c];p=p->p) p->tx[c]=x;
    20         if(!p) x->p=root;
    21         else{ node*q=p->tx[c];
    22             if(q->len==p->len+1) x->p=q;
    23             else{ node*r=newnode();
    24                 r[0]=q[0];r->len=p->len+1;q->p=x->p=r;
    25                 for(;p&&p->tx[c]==q;p=p->p) p->tx[c]=r;
    26             }
    27         } return;
    28     }
    29     void build(char*s){x=root=newnode();for(int i=0;s[i];i++)extend(i,s[i]);return;}
    30     int query(char*t){
    31         int len=strlen(t),ans=0;node*p=root;
    32         for(int i=0,L=0;i<len;i++){
    33             int c=t[i]-'a';
    34             if(p->tx[c])L++,p=p->tx[c];
    35             else{
    36                 for(;p&&!p->tx[c];p=p->p);
    37                 if(p) L=p->len+1,p=p->tx[c];
    38                 else p=root,L=0;
    39             } ans=max(L,ans);
    40         } return ans;
    41     }
    42 }sol;
    43 inline int read(){
    44     int x=0,sig=1;char ch=getchar();
    45     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    46     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    47     return x*=sig;
    48 }
    49 inline void write(int x){
    50     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    51     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    52     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    53 }
    54 char s[maxn],t[maxn];
    55 void init(){
    56     scanf("%s%s",s,t);
    57     sol.init();sol.build(s);write(sol.query(t));
    58     return;
    59 }
    60 void work(){
    61     return;
    62 }
    63 void print(){
    64     return;
    65 }
    66 int main(){init();work();print();return 0;}
  • 相关阅读:
    work 2
    chapter02
    7.23作业
    第五章
    三层交换机
    基于nginx结合openssl实现https
    chapter10--进程和计划任务管理
    Linux系统管理08--服务器RAID及配置实战
    chapter07-- LVM逻辑卷
    Linux系统管理07--文件系统与LVM
  • 原文地址:https://www.cnblogs.com/chxer/p/4560069.html
Copyright © 2020-2023  润新知