l3-2
暴力预处理 30分写法
#include<bits/stdc++.h> #define inf 0x3f3f3f #define ll long long using namespace std; const ll N=1e5+7; ll n,a[N],ans[N],pos,m,maxx; vector<ll>v[N]; vector<ll>jk[N]; struct node{ ll len; ll a[N]; }k[105]; int flag=0; int judge(int i,int j){//块编号 当前位置 if(k[i].len+j-1>n) return 0; for(int z=1;z<=k[i].len;++z){ if(k[i].a[z]!=a[j+z-1]) return 0; } return 1; } void dfs(int i){ if(flag==1){ return ; } if(i==n){ flag=1; cout<<ans[1]; for(int i=2;i<=pos;++i){ cout<<" "<<ans[i]; } return ; } for(int j=0;j<jk[i].size();++j){ ans[++pos]=jk[i][j]; dfs(i+k[jk[i][j]].len-1); ans[pos--]=0; } } int main(){ scanf("%lld",&n); for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); v[a[i]].push_back(i); } scanf("%lld",&m); for(int i=1;i<=m;++i){ scanf("%lld",&k[i].len); for(int j=1;j<=k[i].len;++j){ scanf("%lld",&k[i].a[j]); } for(int j=1;j<=n;++j){ if(judge(i,j)){ jk[j].push_back(i); } } } dfs(1); return 0; }
树里dfs最长链
注意这种写法很容易被卡。。。。
但是天梯真的好水
#include<bits/stdc++.h> #define inf 0x3f3f3f #define ll long long using namespace std; const ll N=1e4+7; ll maxx=0,n,x,q,d[N]; vector<ll>G[N]; int now[N],pos=0,ans[N]; void dfs(int x,int sum){ now[++pos]=x; for(int j=0;j<G[x].size();++j){ int to=G[x][j]; dfs(to,sum+1); } if(sum>maxx){ maxx=sum; for(int i=1;i<=maxx;++i){ ans[i]=now[i]; } } now[pos--]=-1; } int main(){ cin>>n; for(int i=0;i<n;++i){ cin>>x; while(x--){ cin>>q; G[i].push_back(q); d[q]++; } sort(G[i].begin(),G[i].end()); } for(int i=0;i<n;++i){ if(d[i]==0){ dfs(i,1); } } cout<<maxx<<" "; cout<<ans[1]; for(int i=2;i<=maxx;++i){ cout<<" "<<ans[i]; } return 0; }