Codeforces 314B(倍增)
2017-03-14 12:58
204 查看
题意:[a,b]表示将字符串a循环写b遍,[c,d]表示把字符串c循环写d遍,给定a,b,c,d,求一个最大的p,使得[[c,d],p]是[a,b]的子序列(注意不是子串,也就是不要求连续)。(b,d<=1e7,|a|,|c|<=100)
分析:如果找到了最大的s,使得[c,s]是[a,b]的子序列,那么结果显然就是p=s/d
考虑用一个字符串a去匹配[c,s],那么就相当于指针从下标i->下标j,如果i->j中包含了c的分界点,那么答案就要加上分界点个数
这看似还是不好处理,怎么办呢?
注意到[c,s]是由c重复得到的,所以i,j的取值一定是[0,len(c)-1]
所以可以预处理next[i],cnt[i],表示以c的第i个位置为起点,用一个字符串a进行匹配,next表示下一个匹配的位置,cnt表示该次匹配过程中遇到了多少个分界点
那么最后只需要枚举b次,将所有cnt相加就行
这样是O(b)的,也可以跑过
当然这种循环重复的,也可以很方便的用倍增搞,搞成O(logb)的
分析:如果找到了最大的s,使得[c,s]是[a,b]的子序列,那么结果显然就是p=s/d
考虑用一个字符串a去匹配[c,s],那么就相当于指针从下标i->下标j,如果i->j中包含了c的分界点,那么答案就要加上分界点个数
这看似还是不好处理,怎么办呢?
注意到[c,s]是由c重复得到的,所以i,j的取值一定是[0,len(c)-1]
所以可以预处理next[i],cnt[i],表示以c的第i个位置为起点,用一个字符串a进行匹配,next表示下一个匹配的位置,cnt表示该次匹配过程中遇到了多少个分界点
那么最后只需要枚举b次,将所有cnt相加就行
这样是O(b)的,也可以跑过
当然这种循环重复的,也可以很方便的用倍增搞,搞成O(logb)的
相关文章推荐
- Codeforces 932D - Tree 【树上倍增】
- codeforces 519E 倍增法LCA
- Codeforces 786E. ALT 最小割+倍增
- CodeForces 702E Analysis of Pathes in Functional Graph(倍增)
- CodeForces - 842C Ilya And The Tree(树上倍增)
- CodeForces 406 D.Hill Climbing (凸包-Graham扫描法+在线倍增LCA)
- Codeforces 827D (Round #423 Div. 1) D. Best Edge Weight 树上倍增
- 【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集
- CodeForces 609 E.Minimum spanning tree for each edge(最小生成树-Kruskal+在线倍增LCA)
- codeforces 587C:(LCA倍增+维护最小值)
- codeforces 702E Analysis of Pathes in Functional Graph(倍增)
- codeforces 733 F. Drivers Dissatisfaction(最小生成树+lca+倍增去环)
- Codeforces 314 E. Sereja and Squares
- CodeForces 609E Minimum spanning tree for each edge (lca+最小生成树+倍增)
- codeforces 381 D Alyona and a tree(倍增)(前缀数组)
- Codeforces 576D. Flights for Regular Customers(倍增floyd+bitset)
- [codeforces 519E]E. A and B and Lecture Rooms(树上倍增)
- CodeForces - 827D [Best Edge Weight] 倍增+最小生成树+并查集
- codeforces 702E Analysis of Pathes in Functional Graph 倍增
- Codeforces 587C【树上倍增】