以下是引用manesol在2013-8-10 13:45:25的发言:
做acm题目,翻译一个句子,要输入大量数据,所以要使用scanf输入,否则超时,所以不能用string类型而要使用字符数组,但是这些单词又要存到map中,所以我想知道字符数组到底怎么存到map中。
链接: http://acm.hdu.
做acm题目,翻译一个句子,要输入大量数据,所以要使用scanf输入,否则超时,所以不能用string类型而要使用字符数组,但是这些单词又要存到map中,所以我想知道字符数组到底怎么存到map中。
链接: http://acm.hdu.
我随手写了一个,能在VC9.0和g++4.8.1下编译通过,你看着再改改
程序代码:
#include <cstring> #include <vector> #include <algorithm> using namespace std; struct foo_item { char english[11]; unsigned long long martian; // 将字符串转换为数值比较的话,速度肯定比strcmp快多了 foo_item( const char eng[11], const char mar[11] ) { memcpy( english, eng, sizeof(english) ); martian = 0; for( const char* p=mar; *p; ++p ) martian = martian*26 + (*p-'a'); } bool operator< ( const foo_item& rhs ) const { return martian < rhs.martian; } }; struct foo { std::vector<foo_item> english_martian; foo( size_t reserve_size ) { english_martian.reserve( reserve_size ); } void insert( const char eng[11], const char mar[11] ) { english_martian.push_back( foo_item(eng,mar) ); } void sort() { std::sort( english_martian.begin(), english_martian.end() ); } const char* find( const char* mar_begin, const char* mar_end ) const { if( mar_end-mar_begin > 10 ) return NULL; foo_item tmp( "", "" ); tmp.martian = 0; for( const char* p=mar_begin; p!=mar_end; ++p ) tmp.martian = tmp.martian*26 + (*p-'a'); std::vector<foo_item>::const_iterator itor = std::lower_bound( english_martian.begin(), english_martian.end(), tmp ); if( itor==english_martian.end() || tmp<*itor ) return NULL; return itor->english; } }; int main() { // 读入字典表 foo f( 1000 ); // 1000是瞎猜的,文中没提到字典大约有多少行。设正确了能提高效率,但不设也没关系 { scanf( "%*s" ); // 忽略起始的START for( char english[11], martian[11]; scanf("%s%s",english,martian), english[0]!='E'; ) f.insert( english, martian ); f.sort(); } // 读取martian文,并翻译 scanf( "%*c" ); // 忽略 for( char line[3001]; fgets(line,3000,stdin), strcmp(line,"END\n")!=0; ) { for( const char* p=line; *p; ) { if( *p<'a' || *p>'z' ) { putchar( *p ); ++p; continue; } const char* p1 = p; for( ++p; *p && *p>='a' && *p<='z'; ++p ); const char* str = f.find( p1, p ); if( str ) printf( "%s", str ); else printf( "%.*s", size_t(p-p1), p1 ); } } return 0; }