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;
}