hdu1274 문자열 확장 (귀속 or 창고)

7330 단어 귀속창고
제목: 전개 1(1a2b1(ab)1c) = abbabc3(ab2(4ab)) = abaaabaabaabaabaaabaabaabaab와 비슷한 괄호 안에 귀속 특성을 가진 문자열.사고방식: 모든 괄호 안에 유사한 특성을 가지고 모든 괄호 안에 귀속 처리되거나 창고를 빌리는 원리는 똑같다. 귀속은 시스템을 빌리는 창고라고 할 수 있다.부호력이 매우 약해서 며칠 동안 했는데 마지막에 우리oj에 유사한 것을 하나 냈다. 마지막으로 두 가지 코드를 기록하면 원리는 코드를 보면 알 수 있다.임대 창고: 사고방식: 현재 위치를 판단: 1.숫자와 왼쪽 괄호라면 바로 창고에 들어갑니다.2. 자모라면 창고 꼭대기가 숫자인지 판단해 보세요.만약 설명이 자모 앞의 숫자라면, 여기서 주의하면, 숫자는 아마도 여러 개의 숫자일 것이다.많은 다른 사람의 AC 코드에서 이 점을 주의하지 않았는데 마지막에도 AC를 할 수 있다. 단지 이 문제의 데이터가 매우 약하다고 말할 수 있을 뿐이다.3. 오른쪽 괄호라면 창고의 왼쪽 괄호 앞에 있는 물건을 괄호 앞에 있는 횟수를 복사해서 창고에 넣어야 한다.
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;cin>>T;
    while(T--){
        string s,ans;cin>>s;
        stack<char>sta;
        for(int i=0;i<s.size();i++){
           if(s[i]>='0'&&s[i]<='9'||s[i]=='(') sta.push(s[i]);
           else if(isalpha(s[i])){
              if(sta.top()>='0'&&sta.top()<='9'){
                  int t=10;
                  int num=sta.top()-'0'; sta.pop();
                  while(!sta.empty()&&sta.top()>='0'&&sta.top()<='9'){
                      num=num+t*(sta.top()-'0');
                      sta.pop();
                      t*=10;
                  }
                  while(num--){
                    sta.push(s[i]);
                  }
              }
              else sta.push(s[i]);
           }
           else if(s[i]==')'){
              string temp;
              while(sta.top()!='('){
                temp.insert(temp.begin(),sta.top());
                sta.pop();
              }
              sta.pop();
              int num;
              if(sta.empty()||!(sta.top()>='0'&&sta.top()<='9')) num=1;
              else{
                  int t=10;
                  num=sta.top()-'0'; sta.pop();
                  while(!sta.empty()&&sta.top()>='0'&&sta.top()<='9'){
                      num=num+t*(sta.top()-'0');
                      sta.pop();
                      t*=10;
                  }
              }
              while(num--){
                 for(int j=0;j<temp.size();j++) sta.push(temp[j]);
              }
           }
        }
        while(!sta.empty()){
            ans.insert(ans.begin(),sta.top());
            sta.pop();
        }
        cout<<ans<<endl;
    }
}

반복:
#include<bits/stdc++.h>
using namespace std;
int i;
string str(string s)
{
    string temp="";
    int num=0;
    for(;i<s.size();i++){
        if(s[i]>='0'&&s[i]<='9') num=num*10+s[i]-'0';
        else if(isalpha(s[i])){
            if(s[i-1]>='0'&&s[i-1]<='9'){
                for(int j=0;j<num;j++){
                    temp+=s[i];
                }
                num=0;
            }
            else temp+=s[i];
        }
        else if(s[i]=='('){
            if(isalpha(s[i-1])) num=1;
            i++;
            string t=str(s);
            for(int j=0;j<num;j++) temp+=t;
            num=0;
        }
        else return temp;
    }
}

int main()
{
    int T;cin>>T;
    while(T--){
        i=0;
        string s;cin>>s;
        cout<<str(s)<<endl;
    }
}

좋은 웹페이지 즐겨찾기