玛德。。。以后不能再瞎变模板了。。。
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;}