1. 程式人生 > >HihoCoder 1671 DFS

HihoCoder 1671 DFS

範圍 i++ return ++ 字母 str 括號 color int

本以為是個簡單的水題,好吧,其實就是個水題,雖然我還是……

題意的理解上有一點小小的問題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; }

HihoCoder 1671 DFS