以下是引用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;
}







,虽然ac不了