首先对于知识点会在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; }
标签:字符,const,哈希,int,long,ull,字符串 From: https://www.cnblogs.com/youhualiuh/p/18323862