1. 程式人生 > 其它 >6屆國賽java試題 5: 切開字串

6屆國賽java試題 5: 切開字串

技術標籤:python字串演算法

切開字串


Pear有一個字串,不過他希望把它切成兩段。這是一個長度為N(<=10^5)的字串。Pear希望選擇一個位置,把字串不重複不遺漏地切成兩段,長度分別是t和N-t(這兩段都必須非空)。
Pear用如下方式評估切割的方案:
定義“正迴文子串”為:長度為奇數的迴文子串。切成的兩段字串中,前一段中有A個不相同的正迴文子串,後一段中有B個不相同的非正迴文子串,則該方案的得分為AB。
注意,後一段中的B表示的是:“…非正迴文…”,而不是: “…正迴文…”。
那麼所有的切割方案中,A
B的最大值是多少呢?
【輸入資料】
輸入第一行一個正整數N(<=10^5)

接下來一行一個字串,長度為N。該字串僅包含小寫英文字母。
【輸出資料】
一行一個正整數,表示所求的AB的最大值。
【樣例輸入】
10
bbaaabcaba
【樣例輸出】
38
【資料範圍】
對於20%的資料,N<=100
對於40%的資料,N<=1000
對於100%的資料,N<=10^5
思路:
題目說把字串分為2份,前面的一份統計迴文數的數,後面統計不是迴文數的我們可以用2個for迴圈一個用來統計迴文一個統計不迴文,i來表示切的地方就了統計對應迴文和不迴文數,然後在前面的迴文數
後面的迴文數。
程式:

n=int(input())
s=input()
def hw(s): #判斷迴文數的函式
    if
(s[::-1]==s): return 1 return 0 h=[]#迴文數 b=[]#不迴文數 d=set()#統計數 用集合原因的去重 for i in range(0,len(s)-1):#切點從0為開始 j=i for j in range(j,-1,-2): #來遍歷當前切點到前面字串的字元 s1=s[j:i+1] if hw(s1) and len(s1)%2: #判斷是否是迴文數 d.add(s1) h.append(len(d))#新增對應切點的迴文數 d=set()
for i in range(len(s)-1,0,-1):#切點從最後開始 j=i for j in range(j,len(s)): #來遍歷當前切點到後面字串的字元 s1=s[i:j+1] if hw(s1) and len(s1)%2: continue d.add(s1) b.append(len(d))#新增對應切點的不迴文數 con=0 for i in range(n-1): #來統計a*b的最大值 con=max(h[i]*b[n-2-i],con) #[n-2-i]是因為我是反著新增的 print(con)

禁止轉載。僅用於自己學習。對程式錯誤不負責。