连接:http://codeforces.com/problemset/problem/161/C
题目:C. Abracadabra
Polycarpus analyzes a string called abracadabra. This string is constructed using the following algorithm:
- On the first step the string consists of a single character "a".
- On the k-th step Polycarpus concatenates two copies of the string obtained on the (k - 1)-th step, while inserting the k-th character of the alphabet between them. Polycarpus uses the alphabet that consists of lowercase Latin letters and digits (a total of 36 characters). The alphabet characters are numbered like this: the 1-st character is "a", the 2-nd — "b", ..., the 26-th — "z", the 27-th — "0", the 28-th — "1", ..., the 36-th — "9".
Let's have a closer look at the algorithm. On the second step Polycarpus will concatenate two strings "a" and insert the character "b" between them, resulting in "aba" string. The third step will transform it into "abacaba", and the fourth one - into "abacabadabacaba". Thus, the string constructed on the k-th step will consist of 2k - 1 characters.
Polycarpus wrote down the string he got after 30 steps of the given algorithm and chose two non-empty substrings of it. Your task is to find the length of the longest common substring of the two substrings selected by Polycarpus.
A substring s[i... j] (1 ≤ i ≤ j ≤ |s|) of string s = s1s2... s|s| is a string sisi + 1... sj. For example, substring s[2...4] of string s = "abacaba" equals "bac". The string is its own substring.
The longest common substring of two strings s and t is the longest string that is a substring of both s and t. For example, the longest common substring of "contest" and "systemtesting" is string "test". There can be several common substrings of maximum length.
The input consists of a single line containing four integers l1, r1, l2, r2 (1 ≤ li ≤ ri ≤ 109, i = 1, 2). The numbers are separated by single spaces. li and ri give the indices of the first and the last characters of the i-th chosen substring, correspondingly (i = 1, 2). The characters of string abracadabra are numbered starting from 1.
Print a single number — the length of the longest common substring of the given strings. If there are no common substrings, print 0.
3 6 1 4
2
1 1 4 4
0
In the first sample the first substring is "acab", the second one is "abac". These two substrings have two longest common substrings "ac" and "ab", but we are only interested in their length — 2.
In the second sample the first substring is "a", the second one is "c". These two substrings don't have any common characters, so the length of their longest common substring is 0.
/* *2^30内的字符中,2^29上的字符一定是唯一的 *这个是分治的关键 *如果最大相同子串包含这个字符,那么最大子串一定是重叠的部分,否则 *它把两个区间分别分成两部分,这两部分可以分别算出重复的最大子串 *然后找出最大值。 *依次类推 */ #include <cstdio> #include <algorithm> using namespace std ; int solver( int l1 , int r1 , int l2 , int r2 , int step = 30 ) { if( l1 > r1 || l2 > r2 ) return 0 ; //结束条件 int ovl = max( l1 , l2 ) ; int ovr = min( r1 , r2 ) ; int overlap = ( (ovl <= ovr) ? (ovr - ovl + 1) : 0 ) ; //算出重叠部分 if( l1 <= l2 && r1 >= r2 || l1 >= l2 && r1 <= r2 ) return overlap ; //第一种情况,包含的情况,直接返回重叠部分 int m = ( 1 << ( step - 1 ) ) ;//取中间值 int res = overlap ; //两个区间分别被中间的字符分成两部分,两两算出重叠的最大部分,取最大值返回。 res = max( res , solver( min( l1 , m ) , min( r1 , m - 1 ) , min( l2 , m ) , min( r2 , m - 1 ) , step - 1 ) ) ; res = max( res , solver( min( l1 , m ) , min( r1 , m - 1 ) , max( l2 , m + 1 ) - m , max( r2 , m ) - m , step - 1 ) ) ; res = max( res , solver( max( l1 , m + 1 ) - m , max( r1 , m ) - m , min( l2 , m ) , min( r2 , m - 1 ) , step - 1 ) ) ; res = max( res , solver( max( l1 , m + 1 ) - m , max( r1 , m ) - m , max( l2 , m + 1 ) - m , max( r2 , m ) - m , step - 1 ) ) ; return res ; } int main() { int l1 , l2 , r1 , r2 ; while( ~scanf("%d%d%d%d" , &l1 , &r1 , &l2 , &r2 ) ) printf("%d\n" , solver( l1 , r1 , l2 , r2 ) ) ; return 0 ; }
相关推荐
Codeforces题库101-200介绍了一个在编程竞赛领域非常知名的平台——Codeforces。Codeforces是一个专注于计算机编程的俄罗斯网站,由一组来自萨拉托夫国立大学的竞技体育团队成员领导,由Mikhail Mirzayanov领导。该...
标题 "Codeforces 题库 001-100" 暗示了这里讨论的是Codeforces网站上的前100个编程竞赛题目。Codeforces是一个专注于算法竞赛编程的俄罗斯网站,由来自萨拉托夫国立大学的一群体育爱好者组成,以Mikhail Mirzayanov...
打codeforces的神器
Codeforces是一个广受欢迎的在线编程竞赛平台,尤其在ACM(国际大学生程序设计竞赛)社区中备受推崇。这个“codeforces编程网站预测分数插件.zip”文件似乎包含了一个专为Codeforces用户设计的插件,旨在帮助参赛者...
Codeforces Enhancer 1.1.2是一款专为Google Chrome浏览器设计的插件,旨在提升用户在Codeforces编程竞赛平台上的体验。这个插件的主要目标是通过提供一系列实用功能,帮助程序员更有效地进行代码编写、测试和提交,...
暴枚最长桌脚的长度$l$,然后长度比$l$长的桌脚全部都要砍掉长度比$l$短的桌脚选择代价前$k$小的砍掉用线段树维护;示例程序 :typedef long l
根据提供的文档信息,我们可以推断出这是一份由许昊然撰写的Codeforces题目的解题报告。许昊然是国际信息学奥林匹克(IOI)2012年和2013年的金牌获得者,因此他的解题报告极具参考价值。下面我们将详细解读这份报告...
本次提及的是Codeforces round 678的第二部分(division 2),通常这类比赛会包含四道题目,分别标记为A、B、C和D,难度逐渐递增。 在提供的压缩包文件中,我们看到了四个文件:d.cpp、c.cpp、b.cpp和a.out。这代表...
CodeForces是一个知名的在线编程竞赛平台,吸引了众多程序员参与,以提升编程技能和解决算法问题的能力。本资源“CodeForces:针对CodeForces问题的Python解决方案”是为那些使用Python语言解决CodeForces上算法问题...
《Codeforces代码名称解析》 Codeforces是一个全球知名的在线编程竞赛平台,吸引了众多程序员和算法爱好者参与。这里的“codes_names_Codeforces_”标题暗示我们将探讨的是Codeforces平台上一些问题的代码名称。...
Codeforces 185A - Plant 全测试点49个 Codeforces 是一个在线编程平台,提供了大量的编程题目和比赛。其中,185A - Plant 是一个经典的题目,要求编写一个程序来解决植物生长的问题。 在这个题目中,输入是一个...
一个Codeforces、牛客竞赛、AtCoder平台的编程竞赛查询插件,ACMer必备.zip
Codeforces全球第十轮比赛是编程竞赛平台Codeforces举办的一场线上编程比赛,旨在挑战参赛者的算法设计、逻辑思维和编程技巧。在这个比赛中,参赛者通常需要解决一系列算法问题,涵盖数据结构、图论、动态规划、数学...
Codeforces 19 E Fairy 是一道关于图论和二分图的编程竞赛题目。本题要求求解在给定的无向图中,通过删除一条边使得剩余的图成为一个二分图。首先,我们需要理解二分图的概念。二分图是指图中的节点可以分为两个互不...
Codeforces - 1107B. Digital root & 1107C. Brutality(规律 & 贪心)Codeforces - 1107B.
codeforces-ACM竞赛题目-2833道.tgz
Codeforces是一个专注于竞技编程的俄罗斯网站,由来自萨拉托夫国立大学的Mikhail Mirzayanov领导的一组体育运动员创建和维护。该网站为用户提供了以下主要服务:每周大约举办一次的短期(2小时)比赛,即...
1. **算法设计**:参赛者的代码展示了如何使用不同的算法(如贪心、动态规划、回溯、分治等)解决问题。 2. **数据结构**:可能会看到各种数据结构的实现,如链表、树、图、堆、哈希表等。 3. **优化技巧**:包括...
Codeforces是一个全球知名的在线编程竞赛平台,吸引了众多程序员和编程爱好者参与。它的主要特点是定期举行比赛,用户可以在线提交代码,系统自动评测并给出结果。在这个过程中,掌握一些关键的编程技巧和策略对于...
lucifer1004大佬的博客cf上分攻略故里大佬的githubcf思维题刷题数:44- (1421)codeforces 676 div2 A,B done