为什么这一题记搜会炸,得用广搜?
查看原帖
为什么这一题记搜会炸,得用广搜?
802655
ZhuYF1029楼主2024/7/19 21:17

RT,qwq

#define author SweetRainZyf
#define SweetRainZyf zkyFollower
#pragma GCC optimize(1,2,3,"Ofast","inline")
#include <bits/stdc++.h>
#define int long long
#define uint unsigned int
#define double long double
#define mod (int)998244353
#define inf (int)4557430888798830399
#define oo (int)4485090715960753727
#define pii pair<int,int>
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define pf(x) push_front(x)
#define lowbit(x) (x&-x)
#define size(s) (int)s.size()
#define all(s) s.begin(),s.end()
#define fi first
#define se second
#define endl "\n"
using namespace std;
void inline solve();
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    #ifndef ONLINE_JUDGE
        freopen("SweetRainCode.in","r",stdin);
        freopen("SweetRainCode.out","w",stdout);
    #endif
    int t=1;
    //cin >> t;
    while(t--){
        solve();
    }
    return 0;
}
/*--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
const int maxn=20;
const uint base=131;
int n;
char s[maxn],t[maxn];
map<uint,int> dp;
map<string,int> mp;
int inline update(int &x,int y){
    return x=min(x,y);
}
uint hsh(){
    uint res=0;
    for(int i=1;i<=n+2;i++){
        res=res*base+(uint)s[i];
    }
    return res;
}
int dfs(int idx){
    uint val=hsh();
    if(dp.count(val)){
        return dp[val];
    }
    dp[val]=inf;
    bool flag=true;
    for(int i=1;i<=n;i++){
        if(s[i]!=t[i]){
            flag=false;
        }
    }
    if(flag){
        return dp[val]=0;
    }
    for(int pos=1;pos<=n+1;pos++){
        if(s[pos]!='*' && s[pos+1]!='*'){
            swap(s[pos],s[idx]);
            swap(s[pos+1],s[idx+1]);
            update(dp[val],dfs(pos)+1);
            swap(s[pos],s[idx]);
            swap(s[pos+1],s[idx+1]);
        }
    }
    return dp[val];
}
void inline solve(){
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> s[i];
    }
    for(int i=1;i<=n;i++){
        cin >> t[i];
    }
    s[n+1]=s[n+2]=t[n+1]=t[n+2]='*';
    int ans=dfs(n+1);
    if(ans>=inf){
        cout << -1 << endl;
    }else{
        cout << ans << endl;
    }
}
2024/7/19 21:17
加载中...