日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash)

發布時間:2024/4/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

題意

一個長度為3e5的字符串,求長度為iii的字符串滿足字符是回文串而且字符串的前一半也是回文串的個數

思路

回文數求出所有的回文字符串,然后用Manacher或者Hash判斷是否符合條件

#include <bits/stdc++.h> #define LL long long #define P pair<int, int> #define lowbit(x) (x & -x) #define mem(a, b) memset(a, b, sizeof(a)) #define mid ((l + r) >> 1) #define lc rt<<1 #define rc rt<<1|1 #define endl '\n' const int maxn = 3e5 + 5; const int inf = 0x3f3f3f3f; const int mod = 19930726; using namespace std;struct Palindrome_Tree{int nex[maxn][26];int fail[maxn], cnt[maxn], num[maxn]; // num 記錄每個節點右端點的表示回文串的個數int len[maxn], S[maxn]; // cnt 記錄每個節點表示的回文串出現的次數int last, n, p;int newnode(int l) { // 新建節點for (int i = 0; i < 26; ++i) nex[p][i] = 0;cnt[p] = num[p] = 0;len[p] = l;return p++;}void init() { // 初始化p = 0;newnode(0), newnode(-1); // 新建奇根和偶根last = n = 0;S[n] = -1; fail[0] = 1; // 偶根指向}int get_fail(int x) { // 求failwhile (S[n - len[x] - 1] != S[n]) x = fail[x];return x;}void add(int c) { // 添加節點c -= 'a';S[++n] = c;int cur = get_fail(last);if (!nex[cur][c]) {int now = newnode(len[cur] + 2);fail[now] = nex[get_fail(fail[cur])][c];nex[cur][c] = now;num[now] = num[fail[now]] + 1;}last = nex[cur][c];cnt[last]++;}void count() { // 求cntfor (int i = p - 1; i >= 0; --i) cnt[fail[i]] += cnt[i];} }Tree; int RL[maxn << 1]; void Manacher(string s) {string t;for (int i = 0; i < (int)s.size(); ++i) {t += s[i];t += '#';}s = "#" + t;int MaxRight = 0, pos = 0;for (int i = 0; i < (int)s.size(); ++i) {if (i < MaxRight) RL[i] = min(RL[2 * pos - i], MaxRight - i + 1); // 好多這里寫的是 MaxRight - i,個人感覺根據算法思想應該+1計算長度。else RL[i] = 1;int l = i - RL[i];int r = i + RL[i];while (l >= 0 && r < (int)s.size() && s[l] == s[r]) {RL[i] += 1;l = i - RL[i];r = i + RL[i];}if (RL[i] + i - 1 > MaxRight) {MaxRight = RL[i] + i - 1;pos = i;}} } int ans[maxn], pos[maxn]; int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);string s;while (cin >> s) {int len = s.size();Tree.init();for (int i = 0; i <= len * 2; ++i) RL[i] = 0;for (int i = 1; i <= len; ++i) ans[i] = 0;Manacher(s);for (int i = 0; i < len; ++i) {Tree.add(s[i]);pos[Tree.last] = i; }Tree.count();for (int i = 2; i < Tree.p; ++i) {int t = Tree.len[i] / 2;int idx = (pos[i] - t - (Tree.len[i] - t) / 2) * 2 + 1;if ((Tree.len[i] - t) % 2 == 0) idx += 1; if (RL[idx] - 1 >= Tree.len[i] - t) {ans[Tree.len[i]] += Tree.cnt[i];}}for (int i = 1; i <= len; ++i) {if (i > 1) cout << " ";cout << ans[i];}cout << endl;}return 0; } #include <bits/stdc++.h> #define LL long long #define P pair<int, int> #define lowbit(x) (x & -x) #define mem(a, b) memset(a, b, sizeof(a)) #define mid ((l + r) >> 1) #define lc rt<<1 #define rc rt<<1|1 #define endl '\n' const int maxn = 3e5 + 5; const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; using namespace std;struct Palindrome_Tree{int nex[maxn][26];int fail[maxn], cnt[maxn], num[maxn]; // num 記錄每個節點右端點的表示回文串的個數int len[maxn], S[maxn]; // cnt 記錄每個節點表示的回文串出現的次數int last, n, p;int newnode(int l) { // 新建節點for (int i = 0; i < 26; ++i) nex[p][i] = 0;cnt[p] = num[p] = 0;len[p] = l;return p++;}void init() { // 初始化p = 0;newnode(0), newnode(-1); // 新建奇根和偶根last = n = 0;S[n] = -1; fail[0] = 1; // 偶根指向}int get_fail(int x) { // 求failwhile (S[n - len[x] - 1] != S[n]) x = fail[x];return x;}void add(int c) { // 添加節點c -= 'a';S[++n] = c;int cur = get_fail(last);if (!nex[cur][c]) {int now = newnode(len[cur] + 2);fail[now] = nex[get_fail(fail[cur])][c];nex[cur][c] = now;num[now] = num[fail[now]] + 1;}last = nex[cur][c];cnt[last]++;}void count() { // 求cntfor (int i = p - 1; i >= 0; --i) cnt[fail[i]] += cnt[i];} }Tree; int ans[maxn], pos[maxn]; struct Hash{long long p[maxn], hash[maxn], seed = 402653189;long long getHash(int l, int r) {long long ans = (hash[r] - hash[l-1] * p[r-l+1]) % mod;return (ans + mod) % mod;}void init(string s) {int n = s.size();p[0] = 1;for (int i = 1; i <= n; ++i) p[i] = p[i - 1] * seed % mod;for (int i = 1; i <= n; ++i) {hash[i] = (hash[i - 1] * seed % mod + (s[i-1] - 'a' + 1)) % mod;}} }hash1, hash2; int main() {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);string s;while (cin >> s) {int len = s.size();for (int i = 1; i <= len; ++i) ans[i] = 0;Tree.init();for (int i = 0; i < len; ++i) {Tree.add(s[i]);pos[Tree.last] = i; }Tree.count();hash1.init(s);reverse(s.begin(), s.end());hash2.init(s);for (int i = 2; i < Tree.p; ++i) {int t = Tree.len[i] / 2;int l = pos[i] - Tree.len[i] + 2;int r = pos[i] - t + 1;if (hash1.getHash(l, r) == hash2.getHash(len+1-r, len+1-l)) {ans[Tree.len[i]] += Tree.cnt[i];}}for (int i = 1; i <= len; ++i) {if (i > 1) cout << " ";cout << ans[i];}cout << endl;}return 0; }

總結

以上是生活随笔為你收集整理的HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色偷偷噜噜噜亚洲男人的天堂 | 五月色婷婷综合 | 九色porny自拍视频在线播放 | 大吊一区二区三区 | 天堂在线视频 | 国产成人手机视频 | 丰腴饱满的极品熟妇 | 国产精品1页 | 波多野结衣简介 | 超碰在线资源 | av先锋资源网 | 一女二男一黄一片 | 国产成人一区二区三区别 | 国产精品永久免费视频 | 亚洲欧美一区二区三区不卡 | 国产精品老女人 | 很很干很很日 | 成人免费观看视频网站 | 台湾av在线 | 欧美作爱视频 | 一区二区三区国产精品 | 中文av网 | 四季av中文字幕一区 | 91丨porny丨| 51吃瓜网今日吃瓜 | av在线地址 | 亚洲插插插| 精品人妻人人做人人爽夜夜爽 | 国产精品久久亚洲7777 | 噜噜狠狠狠狠综合久久 | 少妇av在线| 久久婷综合 | 免费在线视频一区 | 久久久久久久97 | 欧美蜜桃视频 | 爆操欧美| 中国女人一级一次看片 | 色哒哒影院 | av看片资源 | 国产欧美一区二区三区鸳鸯浴 | 国产91精品一区二区 | 性色av一区二区三区在线观看 | 欧美日韩aa | 成人黄色一级视频 | 欧美人妻一区二区三区 | 国产18禁黄网站免费观看 | 狠狠干导航 | 1024日韩 | 国产在线播放网站 | 天天干夜操 | 国产女主播在线 | 申鹤乳液狂飙 | 天天色视频 | 都市激情亚洲综合 | 国产精品亚洲二区在线观看 | 大桥未久av一区二区三区中文 | 老司机午夜免费视频 | 久久精品无码中文字幕 | 宝贝乖h调教灌尿穿环 | 亚洲女同一区 | 97在线视频观看 | 国产理论视频 | 乐播av一区二区三区 | 欧美日韩国产一级片 | 日韩精品久 | 成人在线国产精品 | 韩国一区二区三区四区 | 欧美性69 | av嫩草| 中文天堂资源在线 | 国产黄色www| 九九激情网 | 操亚洲美女 | 色欲av无码精品一区 | 色播av| 日韩精品第二页 | 免费观看一级黄色片 | 一级黄色片大全 | 狠狠躁日日躁夜夜躁2022麻豆 | 丁香婷婷深情五月亚洲 | 天天操天天射天天舔 | 国产ts丝袜人妖系列视频 | 久久久久亚洲AV成人 | 亚洲精品欧美日韩 | 那个网站可以看毛片 | 国产精品tv | 老司机亚洲精品 | 五月婷婷久久综合 | av国产成人 | 男人天堂2021 | 激情综合激情五月 | 毛片基地在线观看 | 日韩一区网站 | 欧美美女色图 | 久久香蕉网站 | 久久久久久久久久av | 欧美国产精品一区二区三区 | 国产精品永久免费 | 欧美jjzz |