社区讨论
求调(并非用dp)
P4170[CQOI2007] 涂色参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mjdptw1d
- 此快照首次捕获于
- 2025/12/20 11:05 2 个月前
- 此快照最后确认于
- 2025/12/21 20:35 2 个月前
思路:找到每种字符与它之后再次出现的距离,随后模拟覆盖,如果还有只出现一次的字符,则单个修改,最后输出总修改次数.
不知道问什么会RE.
CPP#include<bits/stdc++.h>
using namespace std;
string s;
string t;
int ans;
int d[12507];
struct Node{
int a;
char b;
}k[2507];
int len;
void _s__find(char c,int ct){
for(int i=len-1;i>0;i--){
if(s[i]==c){
if(i==ct){
k[i].a=ct;
k[i].b=s[i];
}else{
d[c+255]=1;
k[ct].a=i;
k[ct].b=s[i];
}
break;
}
}
}
signed main(){
cin>>s;
len=s.size();
for(int i=0;i<len;i++){
if(d[signed(s[i]+255)]==0){
_s__find(s[i],i);
}
}
for(int i=0;i<len;i++){
if(k[i].a!=i&&k[i].a!=0){
bool ffflag=0;
for(int j=i;j<=k[i].a;j++){
if(t[j]!=k[i].b){
ffflag=1;
}
t[j]=k[i].b;
}
if(ffflag==1){
ans++;
}
}
}
for(int i=0;i<len;i++){
// cout<<t[i]<<" "<<s[i]<<endl;
if(t[i]!=s[i]){
ans++;
}
}
cout<<ans;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...