国庆还要集训真是心好累啊,然而艰苦奋斗是必经之路,让我们燃烧灵魂把
10.1
第一场的C题 http://www.bnuoj.com/v3/contest_show.php?cid=6865#problem/C
字符串处理的题目啊,看上去就觉得是KMP,但是我太水了,KMP算法理解不透彻,导致搞死了
这个题让我重新思考了KMP算法
处理的方法是开个栈,栈里面存对应p串的每一位在w串中匹配的位置,再开个数组存此时匹配进去的字符串,然后如果匹配成功,就把这一段从数组中减去,然后栈里面上面的那些也弹出,失配的j变为栈内最顶上存的那个值(就是他在w串中的匹配位置)
这个思想就很好理解了,也很容易实现,我真是太二逼了唉,仍须努力
AC代码 : http://paste.ubuntu.net/12631306/
B题 http://www.bnuoj.com/v3/contest_show.php?cid=6865#problem/B
给你一个数组,求一个数和前面每个数相加的进位的次数,然后求和
题解:原本以为是树状数组维护,但是进位特别复杂,直接GG
后来欣赏了cz大神的做法,感觉nbnb
比如考虑百位的进位,直接两个数模1000之后相加,就知道进位没有,而并不需要每一位都分开,还要考虑低位的进位
于是就是可以处理0-9位,然后每次把每个数模10的i次,然后存入数组A,再开个数组d2记录它如果要进位的话,值需要多大,然后给A数组排序,用d2的值去二分A数组,不过要记得去重,重复的就是当d1>=d2的时候,用d2去二分会取到自己的d1,然后ans-sum之后还需要除以2,因为i考虑到了和j做加法会进位,j也考虑了i的进位,所以要除以2,看来还是需要脑洞啊
AC代码 :http://paste.ubuntu.net/12631345/
http://www.bnuoj.com/v3/contest_show.php?cid=6867#problem/G
题意:给你一个有向的树,然后询问能否从起点到达终点
题解:看着挺简单,但是不知道怎么做,其实是用LCA做,建边的时候如果是正向的就值为1,逆向为0
然后LCA预处理,最后查询的时候就是从起点和终点同时找,但是起点走过的边都是值为1,终点走过的都应该为0,为了方便考虑就用位运算,每次走过的边或一下,正向值为2,反向为1.就可以了
AC代码 : http://paste.ubuntu.net/12704094/