社区讨论

求调(并非用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 条回复,欢迎继续交流。

正在加载回复...