本来是想用golang,因为这是工作中的主要语言,不妨试一试打cf,结果写了一题就被劝退了,golang对于打算法竞赛极不友好
首先,golang在cf中,fmt的各种scanf和printf并不直接接收来自于标准输入输出流的内容,所以有些oj由于没有做对STD IO的支持,golang提交上去就报CE,很恶心
其次,golang里面缺乏很多基本的数据结构,比如set,map也只是单纯的hash实现,效率并不高,所有的东西还需要专门make
而且,golang的类型比较固定,就是说,int无法和long long类型进行运算,虽然这个习惯并不好,但是如果强行cast需要很多代码量,麻烦得很,增加了很多代码量
但是偶尔找个乐子还是可以的
于是乎专门搞了套模板,本来以为golang这种语言有类似于freopen这种东西,结果发现没有,只能用fopen打开,因为golang自带err这个参数,所以直接判断是否成功打开这个文件作为判断oj还是本地,
实现类似功能
功能
1. 支持标准输入输出
2. 支持本地文件流测试
3. 无需更改即可提交oj
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func solve(in *bufio.Reader, out io.Writer) {
var x uint
fmt.Fscan(in, &x)
tmp := x
tot := 0
for tmp != 0 {
if (tmp & 1) != 0 {
tot++
}
tmp >>= 1
}
ans := uint(0)
for i := 0; i <= 30; i++ {
var p uint
p = uint(1 << uint(i))
if (p&x) > 0 && tot > 1 {
fmt.Fprintln(out, p)
return
}
if (p&x) == 0 && ans == uint(0) {
ans |= p
}
if (p & x) != 0 {
tot -= 1
}
}
for i := 0; i <= 30; i++ {
var p uint
p = uint(1 << uint(i))
if (p & x) > 0 {
ans |= p
fmt.Fprintln(out, ans)
return
}
}
}
func run(_r io.Reader, out io.Writer) {
in := bufio.NewReader(_r)
var kase int
fmt.Fscan(in, &kase)
for mmm := 1; mmm <= kase; mmm++ {
solve(in, out)
}
}
func main() {
file, err := os.Open("C:\\Users\\tiany\\GolandProjects\\awesomeProject\\data.txt")
if err != nil {
file = os.Stdin
}
run(file, os.Stdout)
}