ZOJ 3826 Hierarchical Notation
题意:
模拟python的字典功能。。
思路:
先做预处理,以dfs的形式,将每一个{ a : b } 映射为数字u -> ( l , mv ),u为a的哈希值,l为b在s中的起始位置,mv为结束位置。
然后直接查询即可。。
参考:
http://blog.csdn.net/keshuai19940722/article/details/40039745
代码:
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
using namespace std;
#define clr( x , y ) memset(x,y,sizeof(x))
#define cls( x ) memset(x,0,sizeof(x))
#define mp make_pair
#define pb push_back
typedef long long lint;
typedef long long ll;
typedef long long LL;
const lint p = 17 ;
int mv ;
string s , key ;
map<lint , pair<int , int> >G ;
inline int idx( char c ){
if( c >= '0' && c <= '9' ) return c - '0' ;
else if( c >= 'a' && c <= 'z' ) return c - 'a' + 10 ;
else if( c >= 'A' && c <= 'Z' ) return c - 'A' + 36 ;
else if( c == '.' ) return 62 ;
return 63 ;
}
//以dfs的形式,将每一个{ a : b } 映射为数字u -> ( l , mv ),u为a的哈希值,l为b在s中的起始位置,mv为结束位置
void init( lint u ){
lint tmp = u ;
while( s[mv] != '}' ){
mv ++ ;
if( s[mv] == '}' ) return ;
u = tmp ;
while( s[mv] != ':' )
u = u * p + idx( s[mv++] ) ;//将'{'与':'之间的内容映射到一个哈希值u
int l = ++mv ;将':'与下一个'}'之间的内容映射到一个pair
if( s[mv] == '{' )
init( u * p + 62LL ) ;
else
while( s[mv+1] != ',' && s[mv+1] != '}' ) mv++ ;
//cout << u << endl ;
//for( int i = l ; i <= mv ; i++ ) printf( "%c" , s[i] ) ;
//puts("") ;
G[u] = mp( l , mv ) ;
mv ++ ;
}
}
int main(){
//freopen("input.txt","r",stdin);
int t ; cin >> t ;
while( t-- ){
cin >> s ;
mv = 0 ;
G.clear() ;
init( 0LL ) ;
int n ; cin >> n ;
while( n-- ){
cin >> key ;
int len = key.length() ;
lint ans = 0 ;
for( int i = 0 ; i < len ; i++ )
ans = ans * p + idx( key[i] ) ;
//cout << ans << endl ;
if( G.count(ans) ){
for( int i = G[ans].first ; i <= G[ans].second ; i++ )
printf( "%c" , s[i] ) ;
printf( "\n" ) ;
}
else{
puts( "Error!" ) ;
}
}
}
return 0;
}
因为这题给的内存比较小。。所以直接用python模拟好像总是MLE。。
附上MLE的python代码:
t = raw_input()
t = int(t)
for kase in range(t) :
dic = raw_input()
dic = eval( dic )
n = int( raw_input() )
for x in range(n) :
key = raw_input()
key = key.split( '.' )
l = len( key )
d = dic
ok = True
for i in range( l ) :
key[i] = key[i][1:-1]
if key[i] in d :
d = d[key[i]]
else :
ok = False
break
if ok :
d = str( d )
if d.startswith( '{' ) :
d = d.replace( "'" , '"' )
d = d.replace( " " , "" )
else :
d = '"' + d + '"'
print( d )
else :
print( 'Error!' )