AT344D题AC*36,WA*22求调(悬1关)
  • 板块学术版
  • 楼主Solwek
  • 当前回复11
  • 已保存回复11
  • 发布时间2024/3/9 21:42
  • 上次更新2024/3/9 22:03:57
查看原帖
AT344D题AC*36,WA*22求调(悬1关)
684960
Solwek楼主2024/3/9 21:42

深搜:

#include<bits/stdc++.h>
using namespace std;

string t;
int nl;
vector<string>v[11];
string mp[110][110];
int vis[110][110];
map<string,int>mmp;
void dfs(string tmp,int cnt,int len){	
	if((double)clock()/CLOCKS_PER_SEC>0.95){
		cout<<-1;
		exit(0);
	}
	if(cnt>mmp[tmp]&&mmp[tmp]!=0)return;
	mmp[tmp]=cnt;
	if(tmp==t){
		cout<<cnt+1;
		exit(0);
	}
	//abced 5
	//abc 3
	for(int i=min(10,(int)(t.size()-tmp.size()));i>=1;i--){
		for(int l=0;l<(int)(v[i].size());l++){
			if(vis[i][l])continue;
			if(v[i][l]==mp[len][len+i-1]){
				vis[i][l]=1;
				dfs(tmp+v[i][l],cnt+1,len+v[i][l].size());
				vis[i][l]=0;
			}								
		}	
	}
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>t>>n;
	nl=t.size();
	for(int i=0;i<nl;i++)
		for(int j=i;j<nl;j++)
			for(int k=i;k<=j;k++)
				mp[i][j]+=t[k];
	for(int i=1;i<=n;i++){
		int l;
		cin>>l;
		for(int j=1;j<=l;j++){
			string tmp;
			cin>>tmp;
			int q=tmp.size();			
			int f=0;
			for(int k=0;k+q-1<nl;k++){
				if(tmp==mp[k][k+q-1])
					f=1;
			}
			if(f)v[q].push_back(tmp);
		}			
	}
	dfs("",0,0);
	cout<<-1;
    return 0;
}
2024/3/9 21:42
加载中...