编程小技巧 | 解决acm等算法竞赛中TLE问题,如何在不涉及算法的情况下有效给代码提速
一、register关键字
register 关键字会引导变量存储在寄存器中, 而不是内存,寄存器中存取得速度远远优与内存,但是寄存器数量有限,因此可以把少量频繁使用得变量设为 register 关键字,由此加快代码运行速度。
例如:临时的循环变量 i 就很适合使用 register
for (register int i = 1; i <= M; i++) {
cout << i << endl;
}
注意!
register 变量必须时单个值(不能是数组),并且长度小于等于整形长度
二、Cin,Cout加速代码
这个代码可以使 cin, cout 执行效率贴近 scanf 和 printf
但是 cin, cout 不能和 scanf, printf 混用了
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
三、快读
快读int模板
inline int read(){
register int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
这个模板可以从 int 延续到 longlong
拆解
inline int readInt() {
register int x = 0, f = 1; // x是数的绝对值,f表示符号
char c = getchar(); // getchar()获取内容
while (c < '0' || c>'9') {
if (c == '-') f = -1; // 如果符号为负,设置f为-1
c = getchar(); // 下一个
} //现在已经消除所有非数字字符了,下面的就都是数字
while (c >= '0' && c <= '9') {
x = (x << 3) + (x << 1) + (c ^ 48); //把每一位往上加并使用位运算提速
c = getchar(); //下一个
}
return x * f;
}
快读char模板
inline char readChar(){
return getchar();
}
快读char*模板
void readCStr(char *str){
char c = getchar();
while (blank(c)) c = getchar();
int p = 0;
for (str[p++] = c; !blank(c = getchar()); str[p++] = ch);
c[p] = '\0';
}
bool blank(char c){
return c == ' ' || c == '\r' || c == '\n' || c == '\t';
}
快读string模板
// 在char*模板的基础上进行转换
string readString(){
char strBuf[10000];
readCStr(strBuf);
string s = strBuf;
return s;
}
完整类模板
class Scanner{
private:
bool blank(char c);
public:
int readInt();
long long readLL();
char readChar();
void readCStr(char *c);
string readString();
}
inline int Scanner::readInt(){
register int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
inline long long readLL(){
register long long x=0;int f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
inline char Scanner::readChar(){
return getchar();
}
inline void Scanner::readCStr(char *c){
char ch = getchar();
while (blank(ch)) ch = getchar();
int p = 0;
for (c[p++] = ch; !blank(ch = getchar()); c[p++] = ch);
c[p] = '\0';//结尾
}
inline string Scanner::readString(){
char strBuf[10000];
readCStr(strBuf);
string s = strBuf;
return s;
}
inline bool Scanner::blank(char c){
return c == ' ' || c == '\r' || c == '\n' || c == '\t';
}
inline内联函数
可给函数加速