COJ 0885 LCS???
12001 ワード
LCS???
難易度レベル:C;運転時間制限:1000 ms;運行スペース制限:51200 KB;コード長制限:200000 B
試験問題の説明
2つの文字列A、Bを入力し、最長連続共通サブストリング長を出力します.
入力
最初の動作は文字列Aです.
2番目の動作は1つの文字列Bである.
しゅつりょく
彼らの最長連続共通サブストリング長を出力します.
入力例
abababbababbabb
出力例
5
その他の説明
1<=|A|,|B|<=100000
A、Bはいずれも小文字aまたはbからなる.
标题:ここにもう一つLCSがあるのを見て捕まえろ!
難易度レベル:C;運転時間制限:1000 ms;運行スペース制限:51200 KB;コード長制限:200000 B
試験問題の説明
2つの文字列A、Bを入力し、最長連続共通サブストリング長を出力します.
入力
最初の動作は文字列Aです.
2番目の動作は1つの文字列Bである.
しゅつりょく
彼らの最長連続共通サブストリング長を出力します.
入力例
abababbababbabb
出力例
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;}