一道字串貪心題

2021-10-01 10:26:41 字數 2710 閱讀 3888

dna序列

dna.c/cpp/in/out

時間限制:2s

空間限制:2g

題目描述

2023年10月,mit建立了最新的奈米科技研究中心mit.nano。此後,不斷有新的研究成果在此產生。

有一天,研究者發現了一種新的生物,這種生物的基因中含有 條dna序列,每一條都有一定的長度,

科學家們可以將每條dna序列切斷,從而取出它的乙個非空前綴。此後,他們可以將這些字首按任意

順序鏈結起來形成一條完整的dna序列,這樣的dna序列對**癌症有很大的作用。

每條dna序列都僅包含大寫字母「a」,「c」,「g」,「t」。

科學家們很快發現,dna序列的字典序越小,則**癌症的效果越好,他們想知道給定 條dna序列,

他們能獲得的字典序最小的dna序列是什麼。

輸入格式

第一行乙個正整數n

nn ,表示dna序列的個數。

接下來n

nn行,每行乙個非空字串表示一條dna,保證每個字元均為「a」,「c」, 「g」,「t」中的乙個。

輸出格式

輸出一行乙個字串,表示能獲得的字典序最小的dna序列

1

<=n

<=50

,1

<=字

符串長度

<=50

1<=n<=50,1<=字串長度<=50

1<=n

<=5

0,1<=字

符串長度

<=5

0 部分分:存在一種最優解按照1到n

1到n1到

n的順序連線.

首先考慮部分分,可以發現如果順序確定,那麼可以從n到1

n到1n到

1貪心列舉每個字串選擇的字首是多少,時間複雜度o(n

4)

o(n^4)

o(n4

),具體就是暴力列舉每個字首,看放進現有答案是否最優.實現細節:注意每個字串都要選.

然後問題就在於確定順序.

對於每個字串s,找到最短的字首x,滿足xin

f<=s

x^<=s

xinf

<=s

,然後將字串分成xy+

zx^y+z

xy+z

使得x不是z的字首.

那麼合併的順序一定是按照xin

fx^

xinf

字典序公升序然後相同按照z+u

z+uz+

u字典序降序,注意使用字母u

uu的原因是u

uu比四個字母都要大。

感性的理解就是這樣,每次我們希望找個最小的x

xx,然後加入盡量多的x

xx,但是,加完之後我們希望能加的字元盡量小,所以我們把尾巴字典序最小的放後面。

注意實現細節:計算xin

fx^

xinf

時,如果當前的x

xx和剩下的長度為len

lenle

n的字串在len長度內仍然沒有比較出大小,那麼這個x

xx也是合法的.然後就是z

zz,z

zz的開頭會固定在∣x∣

∗t+1

|x|*t+1

∣x∣∗t+

1的位置,這個是根據定義來的(這樣講雖然很奇怪,但是實際就是需要滿足xy+

z==s

x^y+z==s

xy+z==

s)

#include

using

namespace std;

inline

intread()

while

(isdigit

(c))

return t*f;

}int n,m,pre[55]

,ord[55]

,pos[55]

,len[55]

;string s[55]

,ans,tmp,bt,now,q[55]

,alfa,st,cpa,cpb,ans2;

intfc

(int a,

int b)

int tmp=0;

if(cpa>cpb)tmp=1;

if(cpa;return tmp;

}bool

cmp(

int a,

int b)

intmain()

if(m==1)

for(

int i=

1;i<=n;i++)if

(s[i]

[k]>s[i]

[k%j])}

if(flag)}if

(!q[i]

.size()

)int l2=q[i]

.size()

,j;for

(j=l2;j=l2)}if

(!pos[i]

)pos[i]

=j;}

for(

int i=

1;i<=n;i++

)ord[i]

=i;sort

(ord+

1,ord+

1+n,cmp)

;/*for(int i=1;i<=n;i++)

}for

(int j=pre[ord[i]

];j>=

0;j--)}

//if(ans2cout

}

字串程式設計題一道

package cn.exercise.algorithmstest 編寫乙個擷取字串的函式,輸入為乙個字串和位元組數,輸出為按位元組擷取的字串。但是要保證漢字不被截去半個,列如 人abc 4應該擷取為 人ab 輸入 人abc們def 6,應該輸出 人abc 而不是 人abc 半個們 author ...

一道關於字串處理的題

題目要求 按要求分解字串,輸入兩個數m,n m代表輸入的m串字串,n代表輸出的每串字串的位數,不夠補0。例如 輸入2,8,abc 123456789 則輸出為 abc00000 12345678 90000000 include include include include include inc...

一道字串題 對稱字串的最大長度

對稱字串的最大長度。題目 輸入乙個字串,輸出該字串中對稱的子字串的最大長度。比如輸入字串 google 由於該字元 串裡最長的對稱子字串是 goog 因此輸出4。程式如下,自驗證過 bool issym char start,char end else return 0 return 1 int g...