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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

1616: 最长回文串(马拉车算法)

發布時間:2024/9/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1616: 最长回文串(马拉车算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1616: 最長回文串
Time Limit: 1 Sec Memory Limit: 128 MB
[Submit][Status][Web Board]
Description

求一個字符串的最長回文串

Input

第一行輸入n

接下來n行每行每行一個字符串長度<=100000

Output

輸出最長回文串的長度

Sample Input

3
abababa
aaaabaa
acacdas

Sample Output

7
5
3

HINT

不要想太多 Water

Source
/*
提示很水,是因為這題雖然數據大但是常規方法暴力求解也不會超時
我寫這題主要是鞏固**馬拉車算法**
*/
Ac_code:
1.馬拉車算法,時間復雜度為線性的,時間復雜度O(N)

#include <iostream> #include <string> #include <algorithm> using namespace std; int Manacher(string s) {string t;t += '$';for(int i = 0; i < s.size(); i++){t += '#';t += s[i];}t += '#';int p[200005] = {0};int mx = 0,id = 0,resLen = 0;//resCenterfor(int i = 1; i < t.size(); i++){p[i] = mx > i ? min(p[2*id-i],mx-i) : 1;while(t[i+p[i]] == t[i-p[i]]) p[i]++;if(mx < i+p[i]){mx = i + p[i];id = i;}if(resLen < p[i]){resLen = p[i];//resCenter = i;}}return resLen; } int main() {int n;cin>>n;while(n--){string s;cin>>s;cout<<Manacher(s)-1<<endl;//最長回文子串長度為t串最長回文半徑-1//最長回文子串的首地址為(resLen - resCenter)/2}return 0; }

2.中心擴展法

#include <stdio.h> #include <string.h> char s[100005],t[200005]; int solve(char s[]) {int k = 0;t[k++] = '#';for(int i = 0; i < strlen(s); i++){t[k++] = s[i];t[k++] = '#';}int resLen = 0;for(int i = 1; i < strlen(t); i++){int p = i,q = i,sum = 0;while(t[p] == t[q] && p >= 0 && q < strlen(t)){sum++;p--;q++;}if(sum > resLen)resLen = sum;}return resLen; } int main() {int n;scanf("%d",&n);while(n--){scanf("%s",s);printf("%d\n",solve(s)-1);}return 0; }

總結

以上是生活随笔為你收集整理的1616: 最长回文串(马拉车算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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