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!' )
相关文章推荐
- C语言union(联合体 共用体)
- hdu 5435 Peace small elephant(矩阵快速幂)
- java修改文件名
- [ROR]部分特点记录
- Linux文件系统结构
- eclipse使用设置
- 做点mongo的笔记
- Java中集合类的内容总结
- 百度编程 兼职题目。
- HDU 5433
- V7如何实现ActionBar隐藏
- [BZOJ1620][Usaco2008 Nov]Time Management 时间管理
- 【英语】Bingo口语笔记(78) - let系列
- 第一篇博客
- scrapy爬取博客文章
- HEVC学习之二CTU, CU, CTB, CB, PB, TB
- VS2010在同一个解决方案中有多个工程是,点运行会一直运行最开始的工程,有什么办法解决吗?
- Delphi调用C#写的webservice
- Observer模式-Subject/Observer都有基类接口子类可以双向调用
- SqliteDB 操作数据库