正睿aria的礼物

aria的礼物

题目内容

Aria 的生日快到了,Jane 为她准备了一个用密码箱包装起来的礼物。要解开这个密码箱需要解决如下一个谜题。

Jane 给出了目前有一个长度为 n 的全由小写字母构成的字符串。然后改变其中最少数量的字符数(改变的方法是可以将任意一位小写字符替换成另一个小写字符),使得前 k 个字符和后 k 个字符相同。这个最少改变的字符数就是这个密码箱的密码。

Jane 给出了 n,k, 以及这个字符串。Aria 显然懵了,于是她找到了你求助,希望你能给出答案。

分析

说明最终修改过的串应该是开头以n-k为循环的循环串。对于一个位置来说,每隔n-k个字母应该都是一样的,则我们统计每个应该相同的位置
出现次数最多的字符,累加不同的字母个数计入答案。

错误代码

#include<bits/stdc++.h>
using namespace std;
#define rt register int 
#define ll long long 
int k,ans;
char s1[100005],s2[100005];
char s[100005];
int ls;
inline int fd1(int x){return x;}
inline int fd2(int x){return (ls-k+x);}
int main()
{
	freopen("3.in","r",stdin);
//	freopen("3.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>ls>>k;
	for(rt i=1;i<=ls;++i)cin>>s[i];
	for(rt i=1;i<=k;++i)s1[i]=s[i];
	for(rt i=ls-k+1,j=0;i<=ls;++i)s2[++j]=s[i];
	for(rt i=1;i<=k;++i)cout<<s1[i]<<" ";
	cout<<endl;
	for(rt i=1;i<=k;++i)cout<<s2[i]<<" ";
	cout<<endl;
	for(rt i=1;i<=k;++i){
		if(s1[i]!=s2[i]){
			cout<<"i:"<<i<<endl;cout<<"黑色线段位置:"<<fd2(i)+fd2(1)-1<<endl;
			if(s[fd2(i)+fd2(1)-1]==s1[i]){
				cout<<"操作2"<<endl;printf("改变%d位置\n",fd2(i));
				s2[i]=s1[i];s[fd2(i)]=s1[i];s1[fd2(i)]=s1[i];++ans;
				for(rt i=1;i<=ls;++i)cout<<s[i];
				cout<<endl;
				for(rt i=1;i<=k;++i)cout<<s1[i];
				cout<<endl;
				for(rt i=1;i<=k;++i)cout<<s2[i];
				cout<<endl;
			}else{
				cout<<"操作1"<<endl;printf("改变%d位置\n",i);
				s[i]=s2[i];s1[i]=s2[i];++ans;
				for(rt i=1;i<=ls;++i)cout<<s[i];
				cout<<endl;
				for(rt i=1;i<=k;++i)cout<<s1[i];
				cout<<endl;
				for(rt i=1;i<=k;++i)cout<<s2[i];
				cout<<endl;
			}
		}
	}
	cout<<ans;
	return 0;
}
/*
bbaaaabbbabaabaaaab
b b a a a a b b b a b a a b a a a 
a a a a b b b a b a a b a a a a b 
i:1
黑色线段位置:5
操作1
改变1位置
abaaaabbbabaabaaaab
abaaaabbbabaabaaa
aaaabbbabaabaaaab
i:2
黑色线段位置:6
操作1
改变2位置
aaaaaabbbabaabaaaab
aaaaaabbbabaabaaa
aaaabbbabaabaaaab
i:5
黑色线段位置:9
操作1
改变5位置
aaaababbbabaabaaaab
aaaababbbabaabaaa
aaaabbbabaabaaaab!!!!!这里s2的位置也要改变 
i:6
黑色线段位置:10
操作2
改变8位置
aaaababababaabaaaab
aaaababababaabaaa
aaaabababaabaaaab
i:11
黑色线段位置:15
操作1
改变11位置
aaaabababaaaabaaaab
aaaabababaaaabaaa
aaaabababaabaaaab
i:12
黑色线段位置:16
操作2
改变14位置
aaaabababaaaaaaaaab
aaaabababaaaaaaaa
aaaabababaaaaaaab
i:17
黑色线段位置:21
操作1
改变17位置
aaaabababaaaaaaabab
aaaabababaaaaaaab
aaaabababaaaaaaab
7
*/

正确代码

#include<bits/stdc++.h> 
using namespace std;
#define rt register int 
int n,k;
char s[100005];
int cnt[30],ans;
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>k;
	cin>>s+1;
	k=n-k;
	for(rt i=1;i<=k;++i)
	{
		memset(cnt,0,sizeof(cnt));
		for(rt j=i;j<=n;j+=k)
		{
			++cnt[s[j]-'a'];
		}
		int res=0,sum=0;
		for(rt j=0;j<=25;++j)res=max(res,cnt[j]),sum+=cnt[j];
		ans+=sum-res;
	}
	cout<<ans;
	return 0;
}
posted @ 2022-11-07 21:12  zyc_xianyu  阅读(38)  评论(2编辑  收藏  举报