HDU 5371 Hotaru's problem (Manacher,回文串)

  

?

題意:給一個序列,找出1個連續子序列,將其平分成前,中,后等長的3段子序列,要求【前】和【中】是回文,【中】和【后】是回文。求3段最長為多少?由于平分的關系,所以答案應該是3的倍數。

?

思路:先Manacher求最長子串,利用期間所記錄的P 數組,窮舉一下所有可能的前兩串,再用O(1)時間判斷第3串是否符合要求。

  具體做法:

  (1)P[i]記錄的是以i為中心,從i-P[i]+1到i+P[i]-1這段都是回文。由于前兩段之和必為偶數,所以必須選取str[i]為'#'的。

  (2)掃一遍每個'#',以其最長的回文開始窮舉(僅需將P[i]--即可,然后找到右邊對應的'#',判斷P[i]是不是大于所窮舉的長度),直到3段都滿足要求了,跳出此‘#’,換下一個。

  

?

?

 1 #include <iostream>
 2 #include <cstring>
 3 #include <vector>
 4 #include <stdio.h>
 5 using namespace std;
 6 const int N=100010;
 7 int n;
 8 int s[N*2];
 9 int P[N*2];
10 
11 
12 int cal(int len)
13 {
14     if(n<3) return 0;
15     memset(P,0,sizeof(P));
16     int id=1, mx=1;
17     P[0]=1;
18     P[1]=1;
19     for(int i=2; i<len; i++)
20     {
21         P[i] =i>mx? 1: min( P[2*id-i], mx-i);
22         while(s[i+P[i]]==s[i-P[i]])    P[i]++;
23         if(i+P[i]>mx)
24         {
25             id=i;
26             mx=i+P[i];
27         }
28     }
29     int ans=0;
30     for(int i=3; i+4<len; i+=2)
31     {
32         int tag=P[i]-1;
33         if( tag>1 && tag>ans )
34         {
35             while( P[i+tag]<=tag && tag>ans )    tag--;
36             if(tag>ans) ans=tag;
37         }
38     }
39 
40     return ans/2*3;
41 }
42 
43 int main()
44 {
45     //freopen("input.txt", "r", stdin);
46     int t, tmp, j=0;
47     cin>>t;
48 
49     while(t--)
50     {
51         scanf("%d", &n);
52         s[0]=-1;
53         s[1]=-2;
54         for(int i=0,j=2; i<n; i++)
55         {
56             scanf("%d",&tmp);
57             s[j++]=tmp;
58             s[j++]=-2;
59         }
60         s[n*2+2]=-30;
61 
62         printf("Case #%d: %d\n", ++j, cal( n*2+2 ));
63     }
64     return 0;
65 }
AC代碼

?

轉載于:https://www.cnblogs.com/xcw0754/p/4722537.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bash 與 dash

Ubuntu 的 bash和dash的區別 什么是bash &#xff1f; Bash(GNU Bourne-Again Shell)是許多Linux平臺的內定Shell&#xff0c;事實上&#xff0c;還有許多傳統UNIX上用的Shell&#xff0c;像tcsh、csh、ash、bsh、ksh等 等&#xff0c;Shell Script大致都類同&#xff0c;當您學…

350. 兩個數組的交集 II

給你兩個整數數組 nums1 和 nums2 &#xff0c;請你以數組形式返回兩數組的交集。返回結果中每個元素出現的次數&#xff0c;應與元素在兩個數組中都出現的次數一致&#xff08;如果出現次數不一致&#xff0c;則考慮取較小值&#xff09;。可以不考慮輸出結果的順序。 來源&a…

Eclipse:如何附加Java源代碼

在Eclipse中&#xff0c;當您按Ctrl按鈕并單擊任何類名稱時&#xff0c;IDE會將您帶到該類的源文件。 這是項目中具有的類的正常行為。 但是&#xff0c;如果您也希望Java核心類具有相同的行為&#xff0c;則可以通過將Java源代碼附加到Eclipse IDE來實現。 一旦附加了源代碼&a…

【樹狀數組】

問題的提出&#xff1a;是否可以用線性數據結構的方法解決動態統計子樹權和的問題呢&#xff1f; 有的&#xff0c;樹狀數組。 假設當前數組為a[]&#xff0c;元素個數為n。 1. 子區間的權和數組為sum&#xff0c;那么數組a[]中 i 到 j這段區間的數組元素和為sum[i,j] a[k]的累…

2013VS快捷鍵

VS2013常用快捷鍵&#xff1a; 1.回到上一個光標位置/前進到下一個光標位置 1&#xff09;回到上一個光標位置&#xff1a;使用組合鍵“Ctrl -”&#xff1b; 2&#xff09;前進到下一個光標位置&#xff1a;“Ctrl Shift - ”。 2.復制/剪切/刪除整行代碼 1&#xff09;如果…

GWT,GWT-Ext(SmartGWT),GXT(Ext GWT)常見任務

我在我們的JCG合作伙伴之一UI-Programming博客上瀏覽了一些舊文章&#xff0c;并注意到有很多簡短的文章&#xff0c;介紹了如何使用GWT&#xff0c;GWT-Ext&#xff08;SmartGWT&#xff09;和GXT&#xff08;Ext GWT&#xff09;執行一些常見任務。 &#xff09;。 我相信它們…

h.264 去塊濾波

塊效應及其產生原因 我們在觀看視頻的時候&#xff0c;在運動劇烈的場景常能觀察到圖像出現小方塊&#xff0c;小方塊在邊界處呈現不連續的效果&#xff08;如下圖&#xff09;&#xff0c;這種現象被稱為塊效應&#xff08;blocking artifact&#xff09;。 首先我們需要搞清楚…

android開發的知識點(一)

1.android中背景圖的設置&#xff1a; 將背景圖放入到項目中的res/drawable-hdpi或res/drawable-mdpi或res/drawable-xhdpi或res/drawable-xxhdpi等任一文件夾下。然后在layout的xml文件夾下使用android:background"drawable/背景圖名"&#xff0c;其中背景圖必須是p…

566. 重塑矩陣

在 MATLAB 中&#xff0c;有一個非常有用的函數 reshape &#xff0c;它可以將一個 m x n 矩陣重塑為另一個大小不同&#xff08;r x c&#xff09;的新矩陣&#xff0c;但保留其原始數據。 給你一個由二維數組 mat 表示的 m x n 矩陣&#xff0c;以及兩個正整數 r 和 c &…

RabbitMQ播放模塊! 構架

RabbitMQ提供了具有可預測且一致的吞吐量和延遲的高可用性&#xff0c;可伸縮和便攜式消息系統。 RabbitMQ是AMQP &#xff08;業務消息傳遞的開放標準&#xff09;的領先實現 &#xff0c;并且通過適配器支持XMPP&#xff0c;SMTP&#xff0c;STOMP和HTTP來進行輕量級Web消息傳…

Cyclic Nacklace - HDU 3746(next求循環節)

題目大意&#xff1a;給你一些串&#xff0c;問如果想讓這個串里面的循環節至少循環兩次&#xff0c;需要添加幾個字符&#xff08;只能在最前面或者最后面添加&#xff09;。比如ababc 需要添加5個就是添加ababc。 分析&#xff1a;其實字符串的長度len-next[len] 最小循環節…

Xuggler開發教程

大家好&#xff0c; 在這篇文章中&#xff0c;我想介紹JavaCodeGeeks上的一些很酷的新教程。 他們將討論與Xuggler &#xff0c; FFmpeg和Wowza進行媒體&#xff08;音頻/視頻&#xff09;操縱的方式。 我將在這篇文章中跟蹤所有相關的教程。 您可以通過查看Pat較早的關于使用…

739. 每日溫度

請根據每日 氣溫 列表 temperatures &#xff0c;請計算在每一天需要等幾天才會有更高的溫度。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 代碼一 單調棧 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatur…

一個非常好的性格切割問題

結伙stackoverflow看到一道非常不錯的問題。遂拿來分享之。 題目要求&#xff1a;我有一個非常長的字符串&#xff1a; String s1"This is my world. This has to be broken." 我要把上面的字符串打亂以固定的長度&#xff08;比如10&#xff09;使得輸出為&#xff…

Cajo,用Java完成分布式計算的最簡單方法

摘自Jonas Boner在2006年5月1日發布在TheServerSide.com上的文章“ Distributed Computing Easy”中的介紹部分&#xff1a; 分布式計算在企業應用程序開發世界中變得越來越重要。 如今&#xff0c;開發人員不斷需要解決以下問題&#xff1a;如何通過將應用程序擴展到單個節點之…

Java中Integer.parseInt()用法

1.先看看該方法的實現 public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);}2.事實上他可以有兩個參數&#xff0c; public static int parseInt(String s,int radix)意味著將字符串s按照radix進制轉換成整數。太抽象了&#xff0c;…

關于maven相互依賴的工程部署問題

環境&#xff1a;win7 64位&#xff0c;myeclipse10.6&#xff0c;eclipse4.5&#xff0c;都配置了svn插件 問題描述&#xff1a;1、工程模塊化之后都是通過pom配置model來關聯的&#xff0c;svn提交之后&#xff0c;通過myeclipse的svn‘檢出為項目’&#xff0c;依賴的子工程…

什么是JAR包?

jar包就是別人已經寫好的一些類&#xff0c;然后將這些類進行打包&#xff0c;你可以將這些jar包引入你的項目中&#xff0c;然后就可以直接使用這些jar包中的類和屬性了&#xff0c;這些jar包一般都會放在lib目錄下的 轉載于:https://www.cnblogs.com/wulianshang/p/5513474.h…

....

輸入流和輸出流相對于內存設備而言. 將外設中的數據讀取到內存中:輸入將內存的數寫入到外設中&#xff1a;輸出。 字符流的由來&#xff1a;其實就是&#xff1a;字節流讀取文字字節數據后&#xff0c;不直接操作而是先查指定的編碼表。獲取對應的文字。在對這個文字進行操作。…

DataNucleus 3.0與Hibernate 3.5

如官方產品站點所述&#xff0c; DataNucleus Access Platform是現有的最符合標準的開源Java持久性產品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java標準。 它還符合OGC簡單功能規范&#xf…