#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
string s1,s2;
int n;
int ans=INF;
int d[6]={
-3,-2,-1,1,2,3};
int step;
map<string,int> mp;
struct P{
string x;
int k;
};
int bfs(int u,string s){
queue<P> q;
P t={
s,u};
q.push(t);
mp[s]=1;
while(q.size()){
P g=q.front();
q.pop();
int k=g.k;
string x=g.x;
//cout<<x<<endl;
for(int i=0;i<6;i++){
string y=x;
int kk=k+d[i];
if(kk<0||kk>=n) continue;
swap(y[k],y[kk]);
if(mp[y]) continue;
P b={
y,kk};
mp[y]=mp[x]+1;
if(y==s2){
return mp[y];
}
q.push(b);
//cout<<x<<endl;
}
}
return 1;
}
int main(){
cin>>s1>>s2;
n=s1.length();
int start;
for(int i=0;i<n;i++){
if(s1[i]=='*'){
start=i;
}
}
//cout<<n<<" "<<start<<endl;
ans=bfs(start,s1);
cout<<ans-1<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,x;
long long a[100005]={
0},sum=0; //long long的最大值:9223372036854775807(>10^18)
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
sum+=x; //a[i]的前缀和
a[sum%k]++; //将前缀和模k的值相同的区间放在一起
}
long long ans=0;
for(int i=0;i<k;i++)
{
ans+=a[i]*(a[i]-1)/2; //前缀和模k相同的区间中任意挑两个区间可产生一个k倍区间
}
ans+=a[0]; //最终结果加上前缀和模k为0的区间(区间自身就是k倍区间,无需组合)
cout<<ans<<endl;
return 0;
}
#include<iostream>
#define N 102
using namespace std;
int main(){
int a[N],b[N];
int n = 0,i,j,k,sum = 0;
while(cin>>a[n])n++;//存储又有多少个小和尚
for(i=1; i<n; i++)b[i-1] = a[i] - a[i-1] - 1;// 进行Nim博弈的转换
for(i=0; i<n-1; i+=2) sum ^= b[i];//进行异或
if(sum==0)cout<<-1<<endl;//若开始局面为0 则必输
else//若非0 则必赢,因此 需要找到第一步 将局面变为0 的步骤
{
for(i=0; i<n-1; ++i)//枚举移动第i堆 使得剩下的局面异或等于0,
for(j=1; a[i]+j<a[i+1]; ++j) {
//枚举可以移动的步数 保证 前项移动j 步后 不会超过后项
b[i] -= j;//拿走 j个 ,这里代表 前一个向上移动j步
if(i!=0)b[i-1] += j;//它的后一堆b[i]向取走了j个,那莫前一堆 b[i-1] 则要增加j个 第一堆除外
sum = 0;
for(k=0; k<n-1; k+=2) sum ^= b[k];//重新计算局面,
if(sum==0) {
cout<<a[i]<<" "<<a[i]+j<<endl; break;}//若变成0 则后手必败,先手必赢。跳出即可;
b[i] += j;//回溯 这不是必赢的操作
if(i