「杂题乱刷2」CF2069D
1.「杂题乱刷」AT_abc020_c2.「杂题乱刷」CF1846E1 & CF1846E23.「杂题乱刷」CF786C4.「杂题乱刷」Zheng Rui 327 【2018普转提day17专题】洗5.「杂题乱刷」CF1759F6.「杂题乱刷」CF1979C7.「杂题乱刷」CF1985F8.「杂题乱刷」P13969.「杂题乱刷」AT_abc360_d10.「杂题乱刷2」CF1454F Array Partition11.「杂题乱刷2」CF1996F12.「杂题乱刷2」CF1486C1 & CF1486C213.「杂题乱刷2」CF1360H14.「杂题乱刷2」CF862D15.「杂题乱刷2」CF1301C16.「杂题乱刷2」CF2036G17.「杂题乱刷2」P1126718.「杂题乱刷2」CF1370F219.「杂题乱刷2」AT_abc140_e20.「杂题乱刷2」CF601B
21.「杂题乱刷2」CF2069D
22.「杂题乱刷2」P11830 [省选联考 2025] 幸运数字23.「杂题乱刷2」P11843 [USACO25FEB] The Best Subsequence G题目链接
CF2069D(*1900) Palindrome Shuffle(luogu)
CF2069D(*1900) Palindrome Shuffle(codeforces)
解题思路
本文
这题是史,大家一起吃。
首先根据题中定义这题显然长度为
因此此题可以二分答案。
那么容易得出 check 一个长度
-
,此时整个可交换的区间都在左边,只需要前缀和即可 判断一个区间是否合法。 -
,此时整个可交换的区间都在右边,只需要前缀和即可 判断一个区间是否合法。 -
,则此时可交换区间包含左右两边,此时我们继续分讨:-
,此时我们只需要判断左边是否能暴力匹配右边的字母即可。 -
,此时我们只需要判断右边是否能暴力匹配左边的字母即可。
-
那么 check 就做完了,那么整题也就做完了,最后是一个二分板子,不赘述。
时间复杂度
参考代码
string s;
ll n;
ll pre[200010];
ll sum[200010][30];
ll now[30];
bool PRE(ll len){
return pre[len]==len;
}
bool ck(ll l,ll r)
{
if(l==1 && r==n)
return 1;
ll l1,l2,r1,r2;
l1=1,r1=l-1;
l2=r+1,r2=n;
ll len=min(r1,n-l2+1);
if(!PRE(len))
return 0;
if(l+r==n+1)
return 1;
forl(i,0,25)
now[i]=sum[r][i]-sum[l-1][i];
if(l<=n/2 && r<=n/2)
{
if(r!=n/2 && pre[n/2]-pre[r]!=n/2-r)
return 0;
forl(i,0,25)
if(now[i]!=sum[n+1-l][i]-sum[n+1-r-1][i])
return 0;
return 1;
}
else if(l>n/2 && r>n/2)
{
if(l!=n/2+1 && pre[n/2]-pre[n+1-l]!=n/2-(n+1-l))
return 0;
forl(i,0,25)
if(now[i]!=sum[n+1-l][i]-sum[n+1-r-1][i])
return 0;
return 1;
}
else
{
if(n/2-l<r-n/2)
{
// bug2;
forl(i,0,25)
{
now[i]-=sum[n+1-(n+1-l)-1][i]-sum[n+1-r-1][i];
if(now[i]<0)
return 0;
}
/*
r,r-1,n-l
*/
///////
// while(l+r>n+1)
// {
// //r--;
// // cout<<s[n+1-r]<<endl;
// if(!now[s[n+1-r]-'a']--)
// return 0;
// r--;
// }
// bug3;
forl(i,0,25)
if(now[i]&1)
return 0;
return 1;
}
else
{
forl(i,0,25)
{
now[i]-=sum[n+1-l][i]-sum[n+1-(n+1-r)][i];
if(now[i]<0)
return 0;
}
// bug1;
// while(l+r<n+1)
// {
// //l++;
// if(!now[s[n+1-l]-'a']--)
// return 0;
// l++;
// }
// bug4;
forl(i,0,25)
if(now[i]&1)
return 0;
return 1;
}
}
}
bool check(ll Mid)
{
forl(i,1,n-Mid+1)
if(ck(i,i+Mid-1))
return 1;
return 0;
}
ll L,R;
/*
ababa babababab
ababa babb ababa
*/
void _clear(){}
void solve()
{
_clear();
cin>>s;
n=s.size();
s=' '+s;
forl(i,1,n)
{
forl(j,0,25)
sum[i][j]=sum[i-1][j];
sum[i][s[i]-'a']++;
}
forl(i,1,n)
pre[i]=0;
forl(i,1,n/2)
pre[i]=(s[i]==s[n-i+1]);
forl(i,1,n/2)
pre[i]+=pre[i-1];
if(pre[n/2]==n/2)
{
cout<<0<<endl;
return ;
}
// cout<<ck(5,10)<<endl;
// return ;
L=1,R=n;
while(L<R)
{
ll Mid=(L+R)/2;
if(check(Mid))
R=Mid;
else
L=Mid+1;
}
cout<<L<<endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
2024-03-03 「杂题乱刷」洛谷 P4801
2024-03-03 「杂题乱刷」CF1934D2