日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ABB (2020牛客国庆集训派对day1)

發布時間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ABB (2020牛客国庆集训派对day1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ABB

題意:

長度為n的字符串,問最少添加多少字符可以使其構成回文字符串

題解:

最長回文字符串我的第一反應是manacher馬拉車算法,那我們直接馬拉車找到已有最長回文串,然后總長度減去不就是答案嗎?非也 ~ ~ 。注意是讓我們構造最長回文字符串,我們會發現,如果我們用馬拉車找到的最長回文串的最右端不是字符串最右端,那此情況就相當于作廢
比如:
murderforajarofz
我們可以找到最長回文串forajarof,但是最后一位z并不在里面,那你無論怎么構造也用不到forajarof這個回文串,也就是我們要找最長的帶最后一個字符的回文字符串
我們直接在manacher的基礎上改就可以,原本式子中的ans,我們每查找完一次清零,也就是如果找到的回文串不是帶尾的不要,如果帶尾保留最大值
詳細看代碼

代碼:

#include <bits/stdc++.h> using namespace std; const int maxn = 9*1e5+4; char s[maxn]; char str[maxn]; int p[maxn];//表示以i為中心的最長回文子串長度,int init() {int len = strlen(s);str[0] = '@', str[1] = '#';int j = 2;for (int i = 0; i < len; ++i) str[j++] = s[i], str[j++] = '#';str[j] = '\0'; // cout<<j<<endl;return j; } int manacher() {int len = init(),sum=-1; int mx = 0;//同時記錄一個當前延伸最遠的回文子串 int id = 0;//對稱中心 int ans = -1;for (int i = 1; i < len; ++i) {if (i < mx) p[i] = min(p[id * 2 - i], mx - i);else p[i] = 1;while (str[i + p[i]] == str[i - p[i]]) p[i]++;//if(i+p[i]==len-1) if (p[i] + i > mx) mx = p[i] + i, id = i;// cout<<"id="<<id<<endl;ans = max(ans, p[i] - 1);if(mx==len)sum=max(sum,ans);//cout<<"ans="<<ans<<endl;//cout<<"mx="<<mx<<endl;//cout<<"sum="<<sum<<endl;ans=0;}return sum; } int main() {int t;cin>>t;for(int i=0;i<t;i++)cin>>s[i];if(manacher()==0)cout<<t-1<<endl;else cout <<t-manacher()<<endl;return 0; }

總結

以上是生活随笔為你收集整理的ABB (2020牛客国庆集训派对day1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。