正睿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;
}