hdu 1238 Substrings 解題報告

2022-06-10 18:09:11 字數 1178 閱讀 4950

題意很簡單,即找出最長的公共子串。

n個序列為p[0]...p[n-1],最長公共子串(順著看,存放在p[0])的長度為maxlen,逆著看(存放在reverse陣列裡)的長度為maxlen1。由於公共子串行是每個序列的子串,因此不妨列舉第乙個序列(其實列舉最短的那個子串是最好的)的每乙個可能的子串s,以s為模式,分別以p[1]...p[n-1]為目標進行匹配計算。若s為p[1]...p[n-1]的公共子串(strstr[p[k], s) != 0,1  <=  k  <=  n-1),且串的長度》maxlen(或者maxlen1),則將s調整為最長公共子串(maxlen(maxlen1) = s串的長度)。最後比較maxlen和maxlen1的長度,大的那個即是答案。

計算子串匹配時採用了brute force演算法(存在著大量的重複運算,kmp演算法可以提高匹配時效)。另外使用了一些字串庫函式,例如字串長度函式strlen(),比較字串大小的函式strcmp(),字串複製函式strcpy()等。

1 #include 2 #include 

3using

namespace

std;45

char p[105][105];6

char reverse[105];7

char s[105];8

9int

main()

1037

if (ok && maxlen < j-i+1

) //

s是所有序列的公共子串,且s串的長度 > maxlen,則將maxlen調整為s串的長度

38 maxlen = j - i + 1;39

}40}41

for (i = 0; i < len; i++) //

第乙個子串的逆序時的處理,與順序時的處理相同

4253

if (ok && maxlen1 < j-i+1

)54 maxlen1 = j - i + 1;55

}56}57 printf("

%d\n

", (maxlen1 > maxlen ?maxlen1 : maxlen)); //

比較順序和逆序時哪個子串的長度大58}

59}60return0;

61 }

HDU 4455 Substrings 動態規劃

題意 給定乙個整數串,有q組詢問,問這個串中長度為w的子串中不同的數字之和為多少,這題的動態規劃感覺很有技巧性。解法 設f i 表示w為 i 時不同的數字之和,那麼考慮f i 1 和f i 的關係可以得知 f i 1 就是從f i 中去除最後乙個子串後在每個串後加上乙個數字的情況,因此可以得到這樣的...

HDU 4455 Substrings 動態規劃

題意 給定乙個整數串,有q組詢問,問這個串中長度為w的子串中不同的數字之和為多少,這題的動態規劃感覺很有技巧性。解法 設f i 表示w為 i 時不同的數字之和,那麼考慮f i 1 和f i 的關係可以得知 f i 1 就是從f i 中去除最後乙個子串後在每個串後加上乙個數字的情況,因此可以得到這樣的...

hdu 1238 字串操作

題目鏈結 題目的意思就是說給你幾個字串,讓你找出公共子串長度最大的子串,也可以是逆轉的子串 不知道為什麼this部落格把這個題目分類到搜尋裡面了 this include include include using namespace std define inf 0x3f3f3f3f define...