# i n c l u d e < q u e u e > \#include<queue> #include<queue>
# i n c l u d e < s t d i o . h > \#include<stdio.h> #include<stdio.h>
# i n c l u d e < s t r i n g . h > \#include<string.h> #include<string.h>
# i n c l u d e < a l g o r i t h m > \#include<algorithm> #include<algorithm>
# d e f i n e N 4010 \#define\ N\ 4010 #define N 4010
u s i n g n a m e s p a c e s t d ; using\ namespace\ std; using namespace std;
s t r u c t V { i n t x , y , d ; } z ; struct\ V\{\ int\ x,y,d;\ \}\ z; struct V{
int x,y,d; } z;
c h a r A [ N ] , B [ N ] ; i n t n , m , l [ N ] , f [ N ] [ N ] ; q u e u e < V > q ; char\ A[N],B[N];\ int\ n,m,l[N],f[N][N];\ queue<V>\ q; char A[N],B[N]; int n,m,l[N],f[N][N]; queue<V> q;
n a m e s p a c e S A M { namespace\ SAM\{ namespace SAM{
i n t s [ N ] [ 26 ] , m x [ N ] , f [ N ] , c n t = 1 , l s t = 1 ; \quad int\ s[N][26],mx[N],f[N],cnt=1,lst=1; int s[N][26],mx[N],f[N],cnt=1,lst=1;
i n l i n e i n t e x t e n d ( i n t c ) { \quad inline\ int\ extend(int\ c)\{ inline int extend(int c){
i n t p = l s t , n p = l s t = + + c n t , q , n q ; \quad \quad int\ p=lst,np=lst=++cnt,q,nq; int p=lst,np=lst=++cnt,q,nq;
m x [ n p ] = m x [ p ] + 1 ; \quad \quad mx[np]=mx[p]+1; mx[np]=mx[p]+1;
f o r ( ; p & & ! s [ p ] [ c ] ; p = f [ p ] ) s [ p ] [ c ] = n p ; \quad \quad for(;p\&\&!s[p][c];p=f[p])\ s[p][c]=np; for(;p&&!s[p][c];p=f[p]) s[p][c]=np;
i f ( ! p ) r e t u r n f [ n p ] = 1 ; \quad \quad if(!p)\ return\ f[np]=1; if(!p) return f[np]=1;
q = s [ p ] [ c ] ; \quad \quad q=s[p][c]; q=s[p][c];
i f ( m x [ q ] = = m x [ p ] + 1 ) f [ n p ] = q ; \quad \quad if(mx[q]==mx[p]+1)\ f[np]=q; if(mx[q]==mx[p]+1) f[np]=q;
e l s e { \quad \quad else\{ else{
n q = + + c n t ; \quad \quad \quad nq=++cnt; nq=++cnt;
m x [ n q ] = m x [ p ] + 1 ; \quad \quad \quad mx[nq]=mx[p]+1; mx[nq]=mx[p]+1;
f [ n q ] = f [ q ] ; f [ q ] = f [ n p ] = n q ; \quad \quad \quad f[nq]=f[q];\ f[q]=f[np]=nq; f[nq]=f[q]; f[q]=f[np]=nq;
m e m c p y ( s [ n q ] , s [ q ] , 26 < < 2 ) ; \quad \quad \quad memcpy(s[nq],s[q],26<<2); memcpy(s[nq],s[q],26<<2);
f o r ( ; p & & s [ p ] [ c ] = = q ; p = f [ p ] ) s [ p ] [ c ] = n q ; \quad \quad \quad for(;p\&\&s[p][c]==q;p=f[p])\ s[p][c]=nq; for(;p&&s[p][c]==q;p=f[p]) s[p][c]=nq;
} \quad \quad \} }
} \quad \} }
i n l i n e v o i d m a t c h ( ) { \quad inline\ void\ match()\{ inline void match(){
f o r ( i n t x = 1 , i = 1 , c = 0 ; i < = n ; + + i ) { \quad \quad for(int\ x=1,i=1,c=0;i<=n;++i)\{ for(int x=1,i=1,c=0;i<=n;++i){
f o r ( ; x > 1 & & ! s [ x ] [ A [ i ] − ′ a ′ ] ; x = f [ x ] ) ; \quad \quad \quad for(;x>1\ \&\&\ !s[x][A[i]-'a'];x=f[x]); for(;x>1 && !s[x][A[i]−′a′];x=f[x]);
c = m x [ x ] ; \quad \quad \quad c=mx[x]; c=mx[x];
i f ( ! s [ x ] [ A [ i ] − ′ a ′ ] ) l [ i ] = 0 ; e l s e { \quad \quad \quad if(!s[x][A[i]-'a'])\ l[i]=0;\ else\{ if(!s[x][A[i]−′a′]) l[i]=0; else{
x = s [ x ] [ A [ i ] − ′ a ′ ] ; l [ i ] = + + c ; \quad \quad \quad \quad x=s[x][A[i]-'a'];\ l[i]=++c; x=s[x][A[i]−′a′]; l[i]=++c;
} \quad \quad \quad \} }
} \quad \quad \} }
} \quad \} }
} \} }
n a m e s p a c e A A M { namespace\ AAM\{ namespace AAM{
i n t s [ N ] [ 26 ] ; \quad int\ s[N][26]; int s[N][26];
i n l i n e v o i d b u i l d ( ) { \quad inline\ void\ build()\{ inline void build(){
f o r ( i n t i = 1 ; i < = n ; + + i ) \quad \quad for(int\ i=1;i<=n;++i) for(int i=1;i<=n;++i)
f o r ( i n t j = i − 1 ; ; − − j ) { \quad \quad \quad for(int\ j=i-1;;--j)\{ for(int j=i−1;;−−j){
s [ j ] [ A [ i ] − ′ a ′ ] = i ; \quad \quad \quad \quad s[j][A[i]-'a']=i; s[j][A[i]−′a′]=i;
i f ( A [ j ] = = A [ i ] ∣ ∣ ! j ) b r e a k ; \quad \quad \quad \quad if(A[j]==A[i]\ ||\ !j)\ break; if(A[j]==A[i] ∣∣ !j) break;
} \quad \quad \quad \} }
} \quad \} }
} \} }
n a m e s p a c e B A M { namespace\ BAM\{ namespace BAM{
i n t s [ N ] [ 26 ] ; \quad int\ s[N][26]; int s[N][26];
i n l i n e v o i d b u i l d ( ) { \quad inline\ void\ build()\{ inline void build(){
f o r ( i n t i = 1 ; i < = m ; + + i ) \quad \quad for(int\ i=1;i<=m;++i) for(int i=1;i<=m;++i)
f o r ( i n t j = i − 1 ; ; − − j ) { \quad \quad \quad for(int\ j=i-1;;--j)\{ for(int j=i−1;;−−j){
s [ j ] [ B [ i ] − ′ a ′ ] = i ; \quad \quad \quad \quad s[j][B[i]-'a']=i; s[j][B[i]−′a′]=i;
i f ( B [ j ] = = B [ i ] ∣ ∣ ! j ) b r e a k ; \quad \quad \quad \quad if(B[j]==B[i]\ ||\ !j)\ break; if(B[j]==B[i] ∣∣ !j) break;
} \quad \quad \quad \} }
} \quad \} }
} \} }
i n l i n e v o i d d f s ( i n t x , i n t y , i n t d ) { inline\ void\ dfs(int\ x,int\ y,int\ d)\{ inline void dfs(int x,int y,int d){
f o r ( i n t i = 0 ; i < 26 ; + + i ) \quad for(int\ i=0;i<26;++i) for(int i=0;i<26;++i)
i f ( A A M : : s [ x ] [ i ] & & ! S A M : : s [ y ] [ i ] ) { \quad \quad if(AAM::s[x][i]\&\&!SAM::s[y][i])\{ if(AAM::s[x][i]&&!SAM::s[y][i]){
∗ l = m i n ( ∗ l , d + 1 ) ; r e t u r n ; \quad \quad \quad *l=min(*l,d+1);\ return; ∗l=min(∗l,d+1); return;
} \quad \quad \} }
f o r ( i n t i = 0 ; i < 26 ; + + i ) \quad for(int\ i=0;i<26;++i) for(int i=0;i<26;++i)
i f ( A A M : : s [ x ] [ i ] & & S A M : : s [ y ] [ i ] ) \quad \quad if(AAM::s[x][i]\&\&SAM::s[y][i]) if(AAM::s[x][i]&&SAM::s[y][i])
d f s ( A A M : : s [ x ] [ i ] , S A M : : s [ y ] [ i ] , d + 1 ) ; \quad \quad \quad dfs(AAM::s[x][i],SAM::s[y][i],d+1); dfs(AAM::s[x][i],SAM::s[y][i],d+1);
} \} }
i n t m a i n ( ) { int\ main()\{ int main(){
s c a n f ( " % s % s " , A + 1 , B + 1 ) ; \quad scanf("\%s\%s",A+1,B+1); scanf("%s%s",A+1,B+1);
n = s t r l e n ( A + 1 ) ; m = s t r l e n ( B + 1 ) ; \quad n=strlen(A+1);\ m=strlen(B+1); n=strlen(A+1); m=strlen(B+1);
f o r ( i n t i = 1 ; i < = n ; + + i ) S A M : : e x t e n d ( B [ i ] − ′ a ′ ) ; \quad for(int\ i=1;i<=n;++i)\ SAM::extend(B[i]-'a'); for(int i=1;i<=n;++i) SAM::extend(B[i]−′a′);
S A M : : m a t c h ( ) ; \quad SAM::match(); SAM::match();
A A M : : b u i l d ( ) ; B A M : : b u i l d ( ) ; \quad AAM::build();\ BAM::build(); AAM::build(); BAM::build();
∗ l = n ; f o r ( i n t i = 1 ; i < = n ; + + i ) i f ( l [ i ] < i ) ∗ l = m i n ( ∗ l , l [ i ] + 1 ) ; \quad *l=n;\ for(int\ i=1;i<=n;++i)\ if(l[i]<i)\ *l=min(*l,l[i]+1); ∗l=n; for(int i=1;i<=n;++i) if(l[i]<i) ∗l=min(∗l,l[i]+1);
p r i n t f ( " % d \ n " , ∗ l ) ; ∗ l = n ; \quad printf("\%d\backslash n",*l);\ *l=n; printf("%d\n",∗l); ∗l=n;
f o r ( i n t i = 1 ; i < = n ; + + i ) { \quad for(int\ i=1;i<=n;++i)\{ for(int i=1;i<=n;++i){
i n t x = 0 ; \quad \quad int\ x=0; int x=0;
f o r ( i n t j = i ; j < = n ; + + j ) { \quad \quad for(int\ j=i;j<=n;++j)\{ for(int j=i;j<=n;++j){
x = B A M : : s [ x ] [ A [ j ] − ′ a ′ ] ; \quad \quad \quad x=BAM::s[x][A[j]-'a']; x=BAM::s[x][A[j]−′a′];
i f ( ! x ) { ∗ l = m i n ( ∗ l , j − i + 1 ) ; b r e a k ; } \quad \quad \quad if(!x)\{\ *l=min(*l,j-i+1);\ break;\ \} if(!x){
∗l=min(∗l,j−i+1); break; }
} \quad \quad \} }
} \quad \} }
p r i n t f ( " % d \ n " , ∗ l ) ; d f s ( 0 , 1 , 0 ) ; \quad printf("\%d\backslash n",*l);\ dfs(0,1,0); printf("%d\n",∗l); dfs(0,1,0);
p r i n t f ( " % d \ n " , ∗ l ) ; ∗ l = n ; \quad printf("\%d\backslash n",*l);\ *l=n; printf("%d\n",∗l); ∗l=n;
q . p u s h ( ( V ) { 0 , 0 , 0 } ) ; \quad q.push((V)\{0,0,0\}); q.push((V){
0,0,0});
f o r ( i n t x , y , d ; ! q . e m p t y ( ) ; q . p o p ( ) ) { \quad for(int\ x,y,d;!q.empty();q.pop())\{ for(int x,y,d;!q.empty();q.pop()){
z = q . f r o n t ( ) ; \quad \quad z=q.front(); z=q.front();
f o r ( i n t i = 0 ; i < 26 ; + + i ) i f ( x = A A M : : s [ z . x ] [ i ] ) { \quad \quad for(int\ i=0;i<26;++i)if(x=AAM::s[z.x][i])\{ for(int i=0;i<26;++i)if(x=AAM::s[z.x][i]){
i f ( ! ( y = B A M : : s [ z . y ] [ i ] ) ) { p r i n t f ( " % d \ n " , z . d + 1 ) ; r e t u r n 0 ; } \quad \quad \quad if(!(y=BAM::s[z.y][i]))\{\ printf("\%d\backslash n",z.d+1);\ return\ 0;\ \} if(!(y=BAM::s[z.y][i])){
printf("%d\n",z.d+1); return 0; }
e l s e i f ( ! f [ x ] [ y ] ) { f [ x ] [ y ] = 1 ; q . p u s h ( ( V ) { x , y , z . d + 1 } ) ; } \quad \quad \quad else\ if(!f[x][y])\{\ f[x][y]=1;\ q.push((V)\{x,y,z.d+1\});\ \} else if(!f[x][y]){
f[x][y]=1; q.push((V){
x,y,z.d+1}); }
} \quad \quad \} }
} \quad \} }
} \} }
# i n c l u d e < c s t d i o > \#include\ <cstdio> #include <cstdio>
# i n c l u d e < i o s t r e a m > \#include\ <iostream> #include <iostream>
# i n c l u d e < a l g o r i t h m > \#include\ <algorithm> #include <algorithm>
# i n c l u d e < c s t r i n g > \#include\ <cstring> #include <cstring>
# i n c l u d e < c s t r i n g > \#include\ <cstring> #include <cstring>
# i n c l u d e < c m a t h > \#include\ <cmath> #include <cmath>
t y p e d e f l o n g l o n g l l ; typedef\ long\ long\ ll; typedef long long ll;
i n t p o w e r m o d ( i n t a , i n t e x p , i n t m o d e r ) int\ powermod(int\ a,\ int\ exp,\ int\ moder) int powermod(int a, int exp, int moder)
{ \{ {
i n t r e t = 1 ; \ \ \ \ int\ ret\ =\ 1; int ret = 1;
f o r ( ; e x p ; e x p > > = 1 ) \ \ \ \ for\ (;\ exp;\ exp\ >>=\ 1) for (; exp; exp >>= 1)
{ \ \ \ \ \{ {
i f ( e x p & 1 ) \ \ \ \ \ \ \ \ if\ (exp\ \&\ 1) if (exp & 1)
{ \ \ \ \ \ \ \ \ \{ {
r e t = 1 l l ∗ r e t ∗ a % m o d e r ; \ \ \ \ \ \ \ \ \ \ \ \ ret\ =\ 1ll\ *\ ret\ *\ a\ \%\ moder; ret = 1ll ∗ ret ∗ a % moder;
} \ \ \ \ \ \ \ \ \} }
a = 1 l l ∗ a ∗ a % m o d e r ; \ \ \ \ \ \ \ \ a\ =\ 1ll\ *\ a\ *\ a\ \%\ moder; a = 1ll ∗ a ∗ a %