代码
#include<bits/stdc++.h>using namespace std;const int N=1e5+10;int ans[N];void solve()
{//输入字符串长度和字符串int n;string s;cin>>n>>s;//下面说的修改操作是进行异或操作//k表示前后对称位置不相等的字符的对数//m表示前后对称位置相等的字符的对数int k=0,m=0;//字符长度是奇数的情况//该情况最中间的字符可选择性修改if(n&1){//表示的是最中间字符的下标int mid=n/2;//下面是模拟出前后位置不相等和相等的字符的对数int l=mid-1,r=mid+1;while(l>=0&&r<=n-1){if(s[l]!=s[r])k++;elsem++;l--,r++;}//不相等的字符一定需要修改,才可以实现回文串的要求//回文串需要的是,前后对称位置的字符完全相等//前后位置不相等的元素,可以修改,也可以不修改//修改的话是提供两次贡献,有 m 对//最多提供 2m 次贡献//所以修改的区间是 k-k+2m+1for(int i=0;i<=n;i++)if(i>=k&&i<=k+2*m+1)cout<<1;elsecout<<0;cout<<endl;return;}//下面表示的是字符串长度是偶数的情况//最好找一个样例看一下下标的情况是否符合条件//下标很容易写错int mid=n/2;int l=mid-1,r=mid;//这里和上面板块一摸一样,直接复制过来的while(l>=0&&r<=n-1){if(s[l]!=s[r])k++;elsem++;l--,r++;}//cout<<k<<" "<<m<<endl;//字符串长度是偶数的话,没有一个最中间的元素//一定需要修改 k 次以上//上限是 k+2m 次,并且每一次修改都是 k 次加 2 的整数次修改//前后对称位置相等的时候,修改需要把两个元素都修改for(int i=0;i<=n;i++)if(i>=k&&(i-k)%2==0&&i<=k+2*m)ans[i]=1;elseans[i]=0;for(int i=0;i<=n;i++)cout<<ans[i];cout<<endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--)solve();return 0;
}
简短代码
#include<bits/stdc++.h>using namespace std;void solve()
{int n;string s;cin>>n>>s;int cnt=0;for(int i=0;i<n/2;i++)if(s[i]!=s[n-i-1])cnt++;string ans(n+1,'0');for(int i=cnt;i<=n-cnt;i+=(n&1?1:2))ans[i]='1';cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--)solve();return 0;
}
#include<bits/stdc++.h>using namespace std;void solve()
{int n;string s;cin>>n>>s;//假设字符串长度是奇数,那么n/2表示的是最中间的位置的下标//假设是偶数,表示的是最中间两个元素里面靠右边的那个元素的//下标//cnt 统计的是前后对称位置不相等元素的对数int cnt=0;for(int i=0;i<n/2;i++)if(s[i]!=s[n-i-1])cnt++;//初始化答案为全 0,学一下这种写法string ans(n+1,'0');//判断奇数和偶数的两种情况,用 ? 这种语句简短表示for(int i=cnt;i<=n-cnt;i+=(n&1?1:2))ans[i]='1';cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin>>t;while(t--)solve();return 0;
}
字符串
该题题目意思比较难懂,意思是说,把一个给定的字符串修改成回文串,修改的操作是用一个等长的字符串和原来的字符串进行异或操作,这两个字符串都是 01 串
寻找的这个字符串中 1 的个数是需要统计的答案
最后输出的答案是一个字符串,这个比较奇怪的输出方式,字符串的下标表示的是前面说的统计出来的 1 的个数,假设符合条件就把该位置标记为 1 ,不符合条件就把这个位置标记为 0
解法是把前后对称位置的不相等的元素的对数统计出来
我们知道,回文串的要求是前后对称位置的元素相等,所以我们需要进行的操作就是把对称位置不相等的进行一次修改,随便修改一个即可,算一次操作,但是不可以对同一个元素修改两次,不符合题意,两个位置修改哪一个都不影响答案,答案只需要统计使用的 1 的数目
对称位置相等的元素,可以进行修改,每一次修改需要把两个元素都进行修改,要变一起变,大概这种,所以每一次对答案的贡献值是 2
假设字符串长度是奇数的话,最中间的元素可以任意修改,也就是说可以不修改也可以修改一次
以上就是全部的思路,字符串长度是奇数的话,答案就是 k-k+2m+1,k 表示的是前后对称位置的不相等元素的对数,m 表示的是前后对称位置相等元素的对数
偶数的话,首先需要 k 次,然后每一次都是 +2 ,最大值是 k+2m