這個還沒完成 先別看 嗚嗚嗚
首先對於知識點會在8月份更新,目前只是單純的對一道題進行展示
題目連結
https://ac.nowcoder.com/acm/contest/87255/E
題意:
題目要求我們找出兩個等長的字串 a 和 b 中的“好”字元數量。一個字元被稱為“好”字元, 如果它在字串 a 和 b 的所有迴圈同構字串中出現的位置是一致的。換句話說,對於每個 字元 x,要麼在字串 a 和 b 的每個位置都出現,要麼都不出現。
思路:
在對某個字元 x 進行判斷時,因為我們在匹配的時候只需要考慮某個字元是否為 x,所以我們將字串 a 和 b根據每個字元是否為字元 x 轉化為一個01串。
Code:
#include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int N = 1e6 + 10; const int P = 131; ull h1[N << 1], h2[N], p[N << 1] = {1}; void geth(ull h[], const string &s, char c) { int len = s.size(); for (int i = 1; i < len; i++) { h[i] = h[i - 1] * P + (s[i] == c); } } ull get(const ull h[], int l, int r) { return h[r] - h[l - 1] * p[r - l + 1]; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout << fixed << setprecision(15); int n; cin >> n; string a, b; cin >> a >> b; set<char> st(a.begin(), a.end()); a = '%' + a + a; b = '%' + b; for (int i = 1; i <= n * 2; i++) { p[i] = p[i - 1] * P; } int ans = 0; for (char c : st) { geth(h1, a, c); geth(h2, b, c); for (int i = 1; i <= n; i++) { if (get(h1, i, i + n - 1) == get(h2, 1, n)) { ans++; break; } } } cout << ans; return 0; }
1001.迴圈位移
題意:
定義一個字串[A] 它代表著是一個迴圈位移的字串. 給你T組資料,字串A, B.問你在B字串中有多少子串是[A]
分析樣例:
如何解決這個問題,我的方法是字串雜湊
為了處理 A 的迴圈位移,程式碼將 A 自身與自身拼接,形成 A+A。這樣,所有可能的迴圈位移都可以作為 A+A 的子串出現 就將所有A的迴圈位移字串的雜湊值儲存進map裡 再去列舉B的長度為A的雜湊值,去B的長度為A統計是否對映進A裡,累加答案就是最終答案
Code:
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int N = 1048580 * 2; const int P = 131; ull p[N], h1[N], h2[N]; void solve() { string a, b; cin >> a >> b; int n = a.size(), m = b.size(); a = a + a; for (int i = 0; i < (n << 1); i++) { h1[i + 1] = h1[i] * P + a[i]; } for (int i = 0; i < m; i++) { h2[i + 1] = h2[i] * P + b[i]; } map <ull, int> mp; for (int i = 0; i < n; i++) { mp[h1[i + n] - h1[i] * p[n]]++; } int ans = 0; for (int i = 0; i <= m - n; i++) { ans += mp[h2[i + n] - h2[i] * p[n]]; } cout << ans << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); p[0] = 1; for (int i = 1; i < N; i++) { p[i] = p[i - 1] * P; } int _; cin >> _; while(_--) solve(); return 0; }