前言
t
a
g
:
tag :
tag: 蓝桥杯国赛
周期性
字符串变换
传送门 :
题意 :
给定一个
01
01
01字符串,每个回合字符串都会变化如下 :
s i ′ = s i − 1 ⊕ s i ( i > = 1 ) s'_i=s_{i-1} \oplus s_i (i>=1) si′=si−1⊕si(i>=1), s 0 ′ = s 0 s'_0=s_0 s0′=s0
询问
k
k
k次之后字符串的状态
思路 :
我们经过打表可得,字符串总是
2
t
2^t
2t次一循环,
t
表
示
第
一
个
大
于
等
于
字
符
串
长
度
的
二
次
幂
t表示第一个大于等于字符串长度的二次幂
t表示第一个大于等于字符串长度的二次幂
同时又因为字符长度控制在 10000 10000 10000以内,所以我们可以跑一遍暴力
一开始搞出这个规律还是有点疑神疑鬼的,毕竟 2 x 2^x 2x的规律第一次见
暂时不会证明
code :
ll n,k;
string s;
void blgg_orz(){
string temp = s;
int len = s.size();
for(int i = 1;i<=5000;i++){
string cal = "";
cal += temp[0];
for(int j = 1; j < len ; j++ ){
int x = temp[j-1] - '0';
int y = temp[j] - '0';
cal += (char)(x^y+'0');
}
if(cal == s)cout<<i<<endl;
temp = cal;
}
}
int ps;
string ans;
string temp[2];
void calc(){
temp[0] = s;
temp[1] = s;
int val = 1;
n = k%ps;
for(int i=1;i<=n;i++){
for(int j=1;j<temp[0].size(); j ++ ){
temp[val][j] = ((temp[val^1][j] - '0')^(temp[val^1][j-1] - '0'))+'0';
}
val^=1;
}
ans = temp[val^1];
}
void solve(){
cin>>n>>k;
cin>>s;
// blgg_orz();
for(int i=2;i<=110000;i*=2){
if(i>=n){
ps = i ;
break;
}
}
calc();
cout<<ans<<endl;
}
int main(){
//int t;cin>>t;while(t--)
solve();
return 0 ;
}