俺也不知道为啥,刚学的手写hash,本地都A了 提交记录
#include <cstdio>
#include <cstring>
#include <algorithm>
#define R register int
#define printf Ruusupuu = printf
#define int long
using namespace std ;
typedef long double D ;
typedef long long L ;
typedef unsigned long long G ;
const int N = 1e3 + 10 ;
const int M = 131 ;
int Ruusupuu , n ;
inline int read(){
int w = 0 ; bool fg = 0 ; char ch = getchar() ;
while( ch < '0' || ch > '9' ) fg |= ( ch == '-' ) , ch = getchar() ;
while( ch >= '0' && ch <= '9' ) w = ( w << 1 ) + ( w << 3 ) + ( ch - '0' ) , ch = getchar() ;
return fg ? -w : w ;
}
int T ;
char a [N][N] , b [N][N] ;
G hsa [N][N] , hsb [N][N] , p [N] ;
struct HS{
static const int SZ = 1e3 + 10 ;
int pr , mod , head [SZ * 100] , cnt ;
struct E{ int next , w ; } a [SZ * 100] ;
HS(){ cnt = 0 ; mod = 99991 , pr = 20050913 , memset( head , -1 , sizeof( head ) ) ; }
inline int tr( int x ){
if( x < 0 ) x =- x ;
return ( 1ll * x * pr ) % mod ;
}
inline bool operator [] ( int x ){
for( R i = head [tr( x )] ; ~i ; i = a [i].next )
if( a [i].w == x ) return 1 ;
return 0 ;
}
inline void add( int x ){
// printf( "%ld %ld\n" , x , tr ( x ) ) ;
a [++ cnt].next = head [tr( x )] ;
a [cnt].w = x ;
head [tr( x )] = cnt ;
}
inline void clear(){ cnt = 0 , memset( head , -1 , sizeof( head ) ) ; }
} m ;
void sc(){
T = read() , n = read() ; p [0] = 1 ;
for( R i = 1 ; i < N ; i ++ ) p [i] = p [i - 1] * M ;
for( R i = 1 ; i <= T ; i ++ ){
scanf( "%s" , a [i] + 1 ) ;
for( R j = 1 ; j <= n ; j ++ )
hsa [i][j] = hsa [i][j - 1] * M + ( a [i][j] - 'A' + 1 ) ;
}
for( R i = 1 ; i <= T ; i ++ ){
scanf( "%s" , b [i] + 1 ) ;
for( R j = 1 ; j <= n ; j ++ )
hsb [i][j] = hsb [i][j - 1] * M + ( b [i][j] - 'A' + 1 ) ;
}
}
inline bool check( int len ){
for( R i = 0 ; i < n ; i ++ ){
if( i + len > n ) continue ;
m.clear() ; bool fg = 0 ;
// printf( "THIS IS%ld %ld\n" , i , len ) ;
for( R j = 1 ; j <= T ; j ++ ) // m [hsa [j][i + len] - hsa [j][i] * p [len] ] = 1 ;
m.add( hsa [j][i + len] - hsa [j][i] * p [len] ) ;
for( R j = 1 ; j <= T ; j ++ ) {
// printf( "ED%llu %d\n" , hsb [j][i + len] - hsb [j][i] * p [len] , m [hsb [j][i + len] - hsb [j][i] * p [len]] ) ;
if( m [hsb [j][i + len] - hsb [j][i] * p [len]] )
fg = 1 ;
}
if( !fg ) return 1 ;
} return 0 ;
}
void work(){
int l = 0 , r = n ;
while( l < r ){
int mid = ( l + r ) >> 1 ;
if( check( mid ) ) r = mid ;
else l = mid + 1 ;
} printf( "%ld\n" , l ) ;
}
signed main(){
sc() ;
work() ;
return 0 ;
}