zoukankan      html  css  js  c++  java
  • 后缀自动机修订

    玛德。。。以后不能再瞎变模板了。。。

    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=1000000+10,sig=26;
    11 struct SAM{
    12     struct node{
    13         int len,f;node*p,*tx[sig];
    14     }sam[maxn<<1],*nodecnt,*root,*x;int cnt[maxn],h[maxn];node*pos[maxn];
    15     void init(){nodecnt=sam;memset(cnt,0,sizeof(cnt));memset(pos,0,sizeof(pos));memset(h,0,sizeof(h));return;}
    16     node*newnode(int len=0){node*t=nodecnt++;t->len=len;t->f=0;return t;}
    17     void extend(int pos,char ch){
    18         int c=ch-'a';node*p=x;x=newnode(pos+1);x->f=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     void calright(){
    31         int size=nodecnt-sam-1;
    32         for(int i=1;i<=size;i++)cnt[i]=i;
    33         for(node*p=sam;p!=nodecnt;p++)pos[--cnt[p->len]]=p;
    34         for(int i=size;i>=0;i--)if(pos[i]&&pos[i]->p)pos[i]->p->f+=pos[i]->f;return;
    35     }
    36     int query(char*s){
    37         node*p=root;
    38         for(int i=0;s[i];i++)if(!(p=p->tx[s[i]-'a']))return 0;
    39         return p->f;
    40     }
    41 }sol;
    42 inline int read(){
    43     int x=0,sig=1;char ch=getchar();
    44     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    45     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    46     return x*=sig;
    47 }
    48 inline void write(int x){
    49     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    50     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    51     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    52 }
    53 char s[maxn],t[maxn];
    54 void init(){
    55     scanf("%s%s",s,t);
    56     sol.init();sol.build(t);sol.calright();write(sol.query(s));
    57     return;
    58 }
    59 void work(){
    60     return;
    61 }
    62 void print(){
    63     return;
    64 }
    65 int main(){init();work();print();return 0;}
  • 相关阅读:
    目标检测算法原理
    物体检测项目
    Bootstrap+Font Awesome图标不显示 或显示错误解决办法
    关于 微信发送被动回复音乐消息 用户接收不到的问题
    多线程操作SQLite注意事项
    SQLiteDatabase中query、insert、update、delete方法参数说明
    Android开发:使用Fragment改造TabActivity
    UDP广播与多播
    Android 布局文件 属性区别
    Android开发
  • 原文地址:https://www.cnblogs.com/chxer/p/4667181.html
Copyright © 2011-2022 走看看