本地AC,交上去RE和TLE
查看原帖
本地AC,交上去RE和TLE
365246
YksKuusiTAlv楼主2021/6/9 10:07

俺也不知道为啥,刚学的手写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 ;
}

2021/6/9 10:07
加载中...