hdu 3948 求不同回文串的個數

2021-05-27 14:33:40 字數 552 閱讀 6253

求乙個串中不相同的子串可以用字尾陣列求,這題只不過是要求子串是回文串所以也可以用字尾陣列求。求不相同的子串的的演算法中,對於相鄰的兩個字尾 i , j . 字尾 j 能產生的子串的個數為len-height [ j ]. len為 j 字尾的長度,height [ i ] 為字尾 i,j 的最長公共字首。所以求不同子串的個數只需要掃一遍height[ ]陣列即可

對於求回文串的個數,在字串的後面接上這個字串的逆串中間用字串中沒有出現過的字元相隔,這樣以某個字元為中心的回文串就可以通過求兩個字尾的最長公共字首求得,假設i,j為以某個字元為中心的回文串的兩個字尾,所以這個回文串能產生的回文串的個數為i,j的最長公共字首,但是這裡會出現重複的情況,那麼如何去重呢,回想在求不相同子串的過程中的去重方法,同樣可以用在這裡,只不過這裡不是減去height [ i ]。看下面的**:

for(i=1;i=lcp(suffix[i],suffix[k]) (knum) num=cnt;

} else

vis[sa[i]]=1;

}

上面的**就是去重統計。

不同回文子串數目 hdu 3948

將原串反向後接在後面,中間用乙個沒出現過的字元隔開 如 abab k strlen str 連線後變為 abab9baba0 根據height 排序後 i height i 子串 0 0 0 1 0 9baba0 2 0 a0 3 1 ab9baba0 4 2 aba0 5 3 abab9baba0...

判斷回文串,判斷回文數,最長回文串,回文串的個數

判斷乙個字串是否是回文串,首先了解下它的定義 回文串 是乙個正讀和反讀都一樣的字串,比如 level 或者 noon 等等就是回文串。所以判斷是否是回文串,判斷這個字串是否對稱即可。從而用兩個指標同時向中間掃瞄即可判斷。判斷字串是否是回文串,即判斷是否對稱。兩邊指標同時向中間掃瞄,判斷是否相等,不等...

求最長回文字串的長度

題目描述 輸入乙個字串,求出其中最長的回文字串的長度。子串的含義為 在原串中連續出現的字串片段。回文的含義是 正著看和倒著看相同,如abba和yyxyy。在判斷時,應該忽略所有標點符號和空格,且忽略大小寫,但輸出應保持原樣 在回文串的首部和尾部不要輸出多餘字元 輸入字串長度不超過5000,且佔據單獨...