您的位置:首页 > 其它

ZOJ 3826 Hierarchical Notation(模拟-字符串处理)

2015-09-12 22:16 375 查看

ZOJ 3826 Hierarchical Notation

题意:

模拟python的字典功能。。

思路:

先做预处理,以dfs的形式,将每一个{ a : b } 映射为数字u -> ( l , mv ),u为a的哈希值,l为b在s中的起始位置,mv为结束位置。

然后直接查询即可。。

参考:

/article/2062122.html

代码:

[code]/*
* @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代码:

[code]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!' )
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: