CF161C

Abracadabra

https://ac.nowcoder.com/acm/problem/109387

C. Abracadabra

给定字符串a,进行以下操作:
将字符串的结尾插入b(操作次数对应的字符),以b为对称中心构造回文串,得到aba。
上述操作进行到第30次。
a为第一次操作。
b~z对应2~26,0~9对应27~36。
给定,求最长公共子串的长度。

Solution

首先这是一个回文串,且由于操作次数小于36,故对称中心唯一。
根据回文串的性质这个答案,可以分治递归将其向左对称缩小长度。
答案为缩小到有重叠部分时的

Code

#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 + 7;
const ll N = 1e6 + 5;

int solve(int a,int b,int c,int d,int k){
    if(a>b || c>d) return 0;
    if(a>c || (a==c && b<d)) swap(a,c),swap(b,d);
    if(b>=d) return d-c+1;
    if(a==c) return b-a+1;
    int l=1<<k;
    if(c>l) return solve(a,b,c-l,d-l,k);
    if(b<l and d<l) return solve(a,b,c,d,k-1);
    return max({solve(a,b,c,l-1,k),solve(1,d-l,a,b,k),b-c+1});
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    cout<<solve(a,b,c,d,30)<<'\n';
    return 0;
}
11eyes的每日一题 文章被收录于专栏

牛客每日一题

全部评论
第23行为什么分治是取两段中最大的一段,如果两段中间是连续的咋办
点赞 回复 分享
发布于 2021-01-30 22:53

相关推荐

斯卡蒂味的鱼汤:我认为就是逃课实习的学生技术才靠谱
点赞 评论 收藏
分享
06-26 22:20
门头沟学院 Java
码农索隆:让你把简历发给她,她说一些套话,然后让你加一个人,说这个人给你改简历,然后开始卖课
我的求职精神状态
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-18 18:30
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务