【dp/贪心】CF 780 (Div. 3), problem: (C) Get an Even String
难度: 1300
input
6 aabbdabdccc zyx aaababbb aabbcc oaoaaaoo bmefbmuyw
output
3 3 2 0 2 7
开始没调出来, 去看DE了, 就不该往后看, 但是当时思维没跳出来, 也不一定做出来, 呜呜
当时是想着每次更新需要看前一次什么时候有这个字母
此题重要一点更新就是, 越靠前进行配对的字母才是最优, 把问题转化一下, n-配对的字母数即为结果,
这里贴两个代码, 第一个是小小不像dp的dp; 第二个是小小思维,这样做题感觉就简单了
代码一
#include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 2e5+10; int f[N]; char s[N]; int main() { int t; // scanf("%d", &t); cin >> t; while(t --) { scanf("%s", s+1);//这种方法为了后面方便, 建议字符串从1开始 int cnt = 0; int n=0; map<char,int> mp, l; f[0]=0; for(int i = 1; s[i];i++) { f[i]=f[i-1]+1; if(l[s[i]] && i>=l[s[i]]) if(f[i]>f[l[s[i]]-1]+i-l[s[i]]-1) { f[i] = f[l[s[i]]-1]+i-l[s[i]]-1; l.clear(); } l[s[i]]=i; n=i; } cout << f[n]<<'\n'; } return 0; }
代码二
#include <iostream> #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 2e5+10; int be[30]; int f[N]; int main() { int t; // scanf("%d", &t); cin >> t; string s; while(t --) { cin >> s; int cnt = 0; int n = s.size(); map<char,int> mp; for(int i = 0; i<n;i++) { mp[s[i]]++; if(mp[s[i]]==2) cnt ++, mp.clear(); } cout << n-cnt*2<<'\n'; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人