不同回文子串數目 hdu 3948

2021-06-05 04:53:45 字數 1183 閱讀 1954

將原串反向後接在後面,中間用乙個沒出現過的字元隔開;

如"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

6     0             b9baba0

7     1             ba0

8     2             bab9baba0

9     3             baba0

奇數長度情況:

從2到n-1遍歷,第i個所在位置為sa[i],和它對稱的在2*k-sa[i]處,求出這2個字串的公共字首即為以sa[i]處為中心的回文數目。記錄這個長度,如果有重複情況,那麼後面求得的字首減去它。

//不同回文子串數目

#include #include #include #include using namespace std;

const int n=210000;

int wa[n],wb[n],wv[n],wsum[n];

int height[n],sa[n],rank[n];

int n;

char str[n];

int f[n][23];

bool vis[n];

int r[n];

int ans;

int cmp(int *r,int a,int b,int l)

void da(int *r,int *sa,int n,int m)

}int get_rmq(int x,int y)

}else

vis[sa[i]]=1;

} // cout}

else

vis[sa[i]]=1;

} printf("case #%d: %d\n",++ca,ans);

} return 0;

}

hdu 3948 求不同回文串的個數

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

HDU 3068 最長回文 最長回文子串

和上一題一樣,不過這題只是要求最長回文子串的長度 在此採用了非常好用的manacher演算法 據說還是o n 的效率qaq 詳細用法參考了上篇部落格的參考資料,這兩天有空學習一下 source code pragma comment linker,stack 16777216 for c compi...

hdu3608最長回文子串

首先做這個題目時候以為是動態規劃,可惜的是超時了。雖然超時了,但還是先說說動態規劃。設原串為s用dp i,j 表示s i.j 中最大回文字串的長度,則dp i,j 的子問題可以劃分為dp i 1,j dp i,j 1 以及dp i 1,j 1 當然還需要乙個陣列flag i,j 來記錄狀態。若fla...