將原串反向後接在後面,中間用乙個沒出現過的字元隔開;
如"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...