腾讯笔试消消乐与字符串AC代码
第一题消消乐,每次把出现次数最多的两个次数相减,只要保证最后优先队列没有数,就是YES
第四题字符串,求最小循环节,只要循环节一样,就能匹配,cnt++,不一样则无法循环
剩下的几道都只A了一点,有AC的大佬分享下思路吗~
# define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cmath> #include <queue> #include <map> #include <algorithm> #include <stack> #include <iomanip> #include <vector> #include <unordered_map> #include <string> #include <set> using namespace std; typedef long long LL; #define fo(i, a, b) for (unsigned int i = a; i < b; ++i) #define fb(i, a, b) for (unsigned int i = a; i > b; --i) #define min(a, b) ((a) < (b)? (a) : (b)) #define max(a, b) ((a) > (b)? (a) : (b)) const LL MOD = 1000000000007; void tencentOne() { int t; cin >> t; for (int i = 0; i < t; ++i) { int n; cin >> n; unordered_map<int, int> um; int a; for (int j = 0; j < n; ++j) { cin >> a; if (um.find(a) == um.end()) um[a] = 1; else um[a]++; } priority_queue<int, vector<int>, less<int>> pq; for (auto& u : um) pq.emplace(u.second); while (pq.size() > 1) { int a = pq.top(); pq.pop(); int b = pq.top(); pq.pop(); a -= b; if (a) pq.emplace(a); } cout << (pq.size() ? "NO\n" : "YES\n"); } } void getNext(string& s, int len, vector<int>& kmp) { int i = 0; int j = -1; kmp[0] = -1; while (i < len) { if (-1 == j || s[i] == s[j]) kmp[++i] = ++j; else j = kmp[j]; } } void tencentFour() { for (int n; cin >> n;) { string s; cin >> s; int m; cin >> m; int len = s.length(); vector<int> kmp(len + 1, 0); getNext(s, len, kmp); int period = len - kmp[len]; if (len % (len - kmp[len])) period = len; string periodstr = s.substr(0, period); int cnt = 0; fo(i, 0, m) { cin >> s; int len = s.length(); kmp.resize(len + 1); getNext(s, len, kmp); int p = len - kmp[len]; if (len % (len - kmp[len])) p = len; if (s.substr(0, p) == periodstr) cnt++; } cout << cnt << endl; } } int main() { tencentOne(); tencentFour(); return 0; }#腾讯##笔试题目#