HihoCoder 1671 DFS
生活随笔
收集整理的這篇文章主要介紹了
HihoCoder 1671 DFS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本以為是個簡單的水題,好吧,其實就是個水題,雖然我還是……
題意的理解上有一點小小的問題orz,這里的括號里的字母是可以看成一個整體的,可以看作一個字母來進行反轉,
比如說,(abc(de)),反轉后應該是((de)cba),所以左邊找括號右邊找括號+反轉/不反轉括號內的數,O(n)的那種想法是不可行的
(怎么感覺可能也就我這么zz發現不了不可行了……)
這里正確的解法是DFS+括號匹配,直接貼代碼吧,不是什么特別難以理解的問題
#include<bits/stdc++.h> using namespace std; const int MAX=5e6+5; string s; int pos[MAX],L[MAX],R[MAX]; void dfs(int l,int r,int flag) {if(!flag) //第偶數個括號內,不反轉,正向輸出 {for(int i=l;i<=r;i++){if(s[i]!='(')cout<<s[i];else //碰到第奇數個括號,更新輸出區間范圍為下一個括號內的字符串位置{dfs(i+1,R[i]-1,1);i=R[i];}}}else //第奇數個括號內,反轉,逆向輸出 {for(int i=r;i>=l;i--){if(s[i]!=')')cout<<s[i];else //碰到第偶數個括號{dfs(L[i]+1,i-1,0);i=L[i];}}} } int main() {cin>>s;int cnt=0;for(int i=0;i<s.length();i++){if(s[i]=='(')pos[++cnt]=i; //用一個棧來記錄括號的位置else if(s[i]==')'){R[pos[cnt]]=i; //對左右括號的位置進行匹配L[i]=pos[cnt--];}}dfs(0,s.length()-1,0);return 0; }?
轉載于:https://www.cnblogs.com/Egoist-/p/8361526.html
總結
以上是生活随笔為你收集整理的HihoCoder 1671 DFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之创建单元素tuple
- 下一篇: 印钞机 V1.0(量化选基总结)