6屆國賽java試題 5: 切開字串
阿新 • • 發佈:2021-01-25
切開字串
Pear有一個字串,不過他希望把它切成兩段。這是一個長度為N(<=10^5)的字串。Pear希望選擇一個位置,把字串不重複不遺漏地切成兩段,長度分別是t和N-t(這兩段都必須非空)。
Pear用如下方式評估切割的方案:
定義“正迴文子串”為:長度為奇數的迴文子串。切成的兩段字串中,前一段中有A個不相同的正迴文子串,後一段中有B個不相同的非正迴文子串,則該方案的得分為AB。
注意,後一段中的B表示的是:“…非正迴文…”,而不是: “…正迴文…”。
那麼所有的切割方案中,AB的最大值是多少呢?
【輸入資料】
輸入第一行一個正整數N(<=10^5)
【輸出資料】
一行一個正整數,表示所求的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)
禁止轉載。僅用於自己學習。對程式錯誤不負責。