2020-09-30 刷题记录
701. 二叉搜索树中的插入操作
思路:
\(dfs\)。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(!root) root = new TreeNode(val);
else if(val < root->val) root->left = insertIntoBST(root->left, val);
else root->right = insertIntoBST(root->right, val);
return root;
}
};
Cow and Message
原题链接: CodeForces - 1307C
思路:
首先可以确定的是隐藏的字符串的长度一定不超过 \(2\)(因为如果存在比 \(2\) 还长的话,那么其中就可以得到长度为 \(2\) 的隐藏字符串)。
根据上述的结论,设 \(cnt[i][j]\):在 \(s_1\) 到 \(s_i\) 中,字符 \(j\) 出现的个数。
同时记录出每个字符出现的位置。
我们枚举长度为 \(2\) 的字符串可能出现的情况,然后计算出对应的结果。
最后再和长度为 \(1\) 的比较即可。
代码:
const int N = 1e5 + 10;
char s[N];
ll cnt[N][26];
vector<int> rec[26];
int main() {
scanf("%s", s + 1);
int n = strlen(s + 1);
memset(cnt, 0, sizeof cnt);
for(int i = 1; i <= n; i ++) {
for(int j = 0; j < 26; j ++) cnt[i][j] = cnt[i - 1][j];
cnt[i][s[i] - 'a'] ++;
rec[s[i] - 'a'].pb(i);
}
ll ans = 0;
for(int i = 0; i < 26; i ++) {
for(int j = 0; j < 26; j ++) { // 枚举字符串 ji 的情况。
ll tmp = 0;
for(auto it : rec[i]) {
tmp += cnt[it - 1][j]; // 该位置下的字符 i 前面有多少个字符 j。
}
ans = max(ans, tmp);
}
}
for(int i = 0; i < 26; i ++) ans = max(ans, cnt[n][i]);
cout << ans << endl;
return 0;
}