为什么仅仅是交换个顺序效率就差距了近20倍呢

P1092 [NOIP2004 提高组] 虫食算

```cpp #include<iostream> #include<string> #include<stack> #include<queue> #include<algorithm> using namespace std; int n; string a,b,c; int f[30]; int d[30]; bool p[30]; bool check1(){ if(d[a[0]-'A']+d[b[0]-'A']>=n)return 0; for(int i=n-1;i>=0;i--){ int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A']; if(x==-1||y==-1||z==-1)continue; if((x+y+1)%n!=z&&(x+y)%n!=z){return 0;} } return 1; } bool check2(){ int ans=0; for(int i=n-1;i>=0;i--){ int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A']; if((ans+x+y)%n!=z){return 0;} ans=(x+y+ans)/n; } return 1; } bool dfs(int idx){ if(!check1())return 0; if(idx>=n&&check2()){ for(int i=0;i<n;i++){ cout<<d[i]<<" "; }return 1; } for(int i=n-1;i>=0;i--){ if(!p[i]){ p[i]=1; d[f[idx]]=i; if(dfs(idx+1))return 1; d[f[idx]]=-1; p[i]=0; } } return 0; } int main() { for(int i=0;i<26;i++)d[i]=-1; cin>>n; cin>>a>>b>>c; int x=0; bool pan[30]={0}; for(int i=n-1;i>=0;i--){ if(!pan[c[i]-'A']){ f[x]=c[i]-'A';pan[c[i]-'A']=1;x++; } if(!pan[b[i]-'A']){ f[x]=b[i]-'A';pan[b[i]-'A']=1;x++; } if(!pan[a[i]-'A']){ f[x]=a[i]-'A';pan[a[i]-'A']=1;x++; } } dfs(0); return 0; } ```
by hahahahahahahah @ 2021-07-29 19:32:06


```cpp #include<iostream> #include<string> #include<stack> #include<queue> #include<algorithm> using namespace std; int n; string a,b,c; int f[30]; int d[30]; bool p[30]; bool check1(){ if(d[a[0]-'A']+d[b[0]-'A']>=n)return 0; for(int i=n-1;i>=0;i--){ int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A']; if(x==-1||y==-1||z==-1)continue; if((x+y+1)%n!=z&&(x+y)%n!=z){return 0;} } return 1; } bool check2(){ int ans=0; for(int i=n-1;i>=0;i--){ int x=d[a[i]-'A'],y=d[b[i]-'A'],z=d[c[i]-'A']; if((ans+x+y)%n!=z){return 0;} ans=(x+y+ans)/n; } return 1; } bool dfs(int idx){ if(!check1())return 0; if(idx>=n&&check2()){ for(int i=0;i<n;i++){ cout<<d[i]<<" "; }return 1; } for(int i=n-1;i>=0;i--){ if(!p[i]){ p[i]=1; d[f[idx]]=i; if(dfs(idx+1))return 1; d[f[idx]]=-1; p[i]=0; } } return 0; } int main() { for(int i=0;i<26;i++)d[i]=-1; cin>>n; cin>>a>>b>>c; int x=0; bool pan[30]={0}; for(int i=n-1;i>=0;i--){ if(!pan[a[i]-'A']){ f[x]=a[i]-'A';pan[a[i]-'A']=1;x++; } if(!pan[c[i]-'A']){ f[x]=c[i]-'A';pan[c[i]-'A']=1;x++; } if(!pan[b[i]-'A']){ f[x]=b[i]-'A';pan[b[i]-'A']=1;x++; } } dfs(0); return 0; } ```
by hahahahahahahah @ 2021-07-29 19:32:46


```cpp if(!pan[c[i]-'A']){ f[x]=c[i]-'A';pan[c[i]-'A']=1;x++; } if(!pan[b[i]-'A']){ f[x]=b[i]-'A';pan[b[i]-'A']=1;x++; } if(!pan[a[i]-'A']){ f[x]=a[i]-'A';pan[a[i]-'A']=1;x++; } if(!pan[a[i]-'A']){ f[x]=a[i]-'A';pan[a[i]-'A']=1;x++; } if(!pan[c[i]-'A']){ f[x]=c[i]-'A';pan[c[i]-'A']=1;x++; } if(!pan[b[i]-'A']){ f[x]=b[i]-'A';pan[b[i]-'A']=1;x++; } ```
by hahahahahahahah @ 2021-07-29 19:34:31


@[hahahahahahahah](/user/504778) 两个的区别就只有这里不一样 也就是一个是从上到下 一个是从下到上的区别 运行速度差距怎么这么大呢
by hahahahahahahah @ 2021-07-29 19:36:23


@[hahahahahahahah](/user/504778) 我看了下你的提交,你 TLE 提交和 AC 提交之间的区别不是这里,是 dfs 的枚举顺序,倒序就过了 为什么倒序就能过,这个我不太知道
by WYXkk @ 2021-07-29 19:52:52


@[WYXkk](/user/130151) 不是 你看我的第三次提交和第二次提交的区别.第一次确实是因为倒序TLE了
by hahahahahahahah @ 2021-07-29 22:08:05


@[WYXkk](/user/130151) 就是那个90分和100的
by hahahahahahahah @ 2021-07-29 22:12:12


|