WA #6,7,9,10....(22个:(
查看原帖
WA #6,7,9,10....(22个:(
397812
MuronaQwQ楼主2024/3/11 19:11
#include<map>
#include<cmath>
#include<cstdio>
#include<time.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

#define    int    long long

const int MAXN = 110;

bool mp[MAXN][MAXN][MAXN*10];
int lenT,t1,n,minn=1e18,a[MAXN],len[MAXN][MAXN],dis[MAXN];
string str[MAXN][MAXN],t;

void dfs(int k,int sum){
    // if(t1-clock()==1900){
    //     printf("-1");
    //     exit(0);
    // }
    if(sum>minn) return;
    if(sum>=dis[k]) return;
    dis[k]=sum;
    if(k>=lenT){
        minn=min(minn,sum);
        return;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=a[i];j++){
            if(mp[i][j][k]){
                dfs(k+len[i][j],sum+1);
            }
        }
    }
}

signed main(){
    t1=clock();
    cin>>t;
    lenT=t.length();
    scanf("%lld",&n);
    memset(dis,0x3f,sizeof(dis));
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        for(int j=1;j<=a[i];j++){
            cin>>str[i][j];
            len[i][j]=str[i][j].length();
        }
    }
    // for(int i=0;i<lenT;i++){
    //     for(int j=i;j<lenT;j++){
    //         mp[{t.substr(i,j-i+1),i}]=true;
    //     }
    // }
    for(int i=0;i<lenT;i++){
        for(int j=1;j<=n;j++){
            for(int k=1;k<=a[j];k++){
                if(i+len[j][k]-1<lenT && t.substr(i,len[j][k])==str[j][k]){
                    mp[j][k][i]=true;
                }
            }
        }
    }
    int ans=0;
    dfs(0,0);
    if(minn>=1e9) minn=-1;
    printf("%lld",minn);
    return 0;
}

感觉记忆化搜索和 dp 差不多多(

时间也很可以 (1∼4ms)(1\sim4 ms)

但就是错了(悲

2024/3/11 19:11
加载中...