F. Sequence Decoding (National Contest for Private Universities (NCPU), 2019)

題目鏈接

 

INPUT
3
PHPHP
2[3[P]H2[P]]
HH2[P3[H]]P

OUTPUT
PHPHP
PPPHPPPPPHPP
HHPHHHPHHHP

題意:擴展字符串。

思路:每次都先將括號匹配的位置記錄下來,遍歷一下還有沒有括號,沒有就結束,否則就繼續遍歷,每次循環去掉一個括號。

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
#define MAX 1e9+7
#define inf 0x3f3f3f
const int M=1e5+10;
typedef long long ll;
stack<int> st;
using namespace std;
struct A{
    char c;
    int p;
} a[1010];
int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        string s;
        cin >> s;
        while(1)
        {
           memset(a, 0, sizeof(a));
           while(!st.empty())
               st.pop();
           int len = s.size();
           for (int i = 0; i < len; i++)
          //記錄括號匹配的位置,就是在左括號的位置賦上右括號的位置
           {
               a[i].c = s[i];
               a[i].p = i;
               if (s[i] == '[')
                   st.push(i);
               if (s[i] == ']')
               {
                   int topp = st.top();
                   a[topp].p = i;
                   st.pop();
               }
            }
            int sum = 0;
            for (int i = 0; i < len; i++)
                if(s[i]=='[')
                sum++;
            if(sum==0)//結束條件
                break;
            string t;
            //cout << "sum  =  :" << sum << endl;
            int pp, pos1 = 0, pos2 = 0;
            len = s.size();//每次長度都在變化
            //cout << "len   :" << len<<endl;
            for (int i = 0; i < len; i++)
            {
                if (s[i] == '[')
                {
                    pp = s[i - 1] - '0';//括號前面的係數
                    pos1 = i;
                    pos2 = a[i].p;
                    //每次去掉一個括號之後將字符串分爲三部分,在分別連接起來
                    if (pos1 - 1 > 0)
                        t = s.substr(0, pos1 - 1);
                    else
                        t = "";

                    for (int j = 1; j <= pp; j++)
                        t += s.substr(pos1 + 1, pos2 - pos1 - 1);

                    if (len - pos2 > 0)
                        t += s.substr(pos2 + 1, len - pos2);
                    s = t;
                    break;//每次循環去掉一個係數
                }
            }
       }
        cout << s << endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章