[伯俊]9935号文字列爆発

17820 ワード

[伯俊]9935号文字列爆発


9935:文字列爆発
  • が爆発した場合、文字は文字列から消え、+残りの文字列がマージされます.
  • IF、爆発文字列→[すべての]爆発文字列爆発が存在する.
  • 余剰文字列生成
  • 新しく生成された文字列には、爆発文字列が含まれる可能性があります.
    これは
  • が接続された結果で、最大値が以前爆発した文字列の数と同じかどうかです.
  • の爆発は、爆発文字列が文字列に含まれないまで続きます.
  • 尚根はすべての爆発が終わった後、「何の文字列が残っているのか」を求めてみた.
    余剰文字がない場合は出力→「FRULA」
  • 爆発文字列「同じ文字Xを2つ以上含む」
    したがって、abababababの場合、爆発ドア奨励はabaのようなことは起こらない(このような場合、bbやababが残る...このような奇妙な状況も発生する可能性がある)
  • 文字列の長さは1百万以下
  • より大きい.
  • 爆発文字列の長さが1より大きく、36以下の
  • の2つの文字列は、「小文字、大文字」+「0~9」のみで構成されています.
  • 例を見てみましょう

    mirkovC4nizCC44
    C4
    ==============첫 번째 폭발
    mirkovnizC4
    =============== 두 번째 폭발
    mirkovniz

    草の考え


    (1:20....)
  • まず...1回の爆発で[すべての]爆発文字列が爆発することに注意してください.
  • 単純に全探索で毎回爆発し、結果がまた爆発したら・・・
  • の各爆発では、1つの爆発しかなく、その結果、各爆発の文字列が生成される可能性があります.
  • は100万x...できるかもしれない.
  • タイムアウトが発生します.
  • 2 2 2つ目のアイデア:stackを使うのはどうですか?
  • の場合、標準は、爆発文字列の最後の文字と同じで、遭遇するたびにスタックからn-1文字が順次ポップアップされ、爆発文字列と同じかどうかを確認します=>そうなると100万個の確認を繰り返すことはなく、.
  • スタックにより多くの文字がない場合は、失敗に等しい.今までpopを
  • に戻します
  • で失敗した場合(1文字目が爆発文字列の文字と異なる場合)、ポップアップ・コンテンツを再読み込みする必要があります...
  • に成功すれば、target爆発文字列と同じpopをstackから完了するだけです.
  • import java.io.*;
    import java.util.*;
    
    public class Main {
        public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        public static StringTokenizer st;
        public static StringBuilder sb = new StringBuilder("");
        public static String src,target;
        public static Deque<Character> stack = new LinkedList<>();
        public static void setting() throws IOException {
            src = br.readLine();
            target = br.readLine();
        }
        public static void solve() throws IOException {
            for(int j=0;j<src.length();j++) {
                if(src.charAt(j)==target.charAt(target.length()-1)){
                    // iterate해 나간다. target.charAt(target.length()-1)) 에 있는 character와 비교하여, 같은 순간에는, stack에서 순차적으로 n-1개를 꺼낸다
                    // 꺼내는 도중에, target(i)와 같지 않다면 -> 다시 stack에 넣어줘야 한다.
                    for (int i = target.length() - 2; i >= 0; i--) {
                        if(stack.isEmpty()){
                            // fail
                            // 다시 넣어주는 과정:repush
                            for (int re = i + 1; re < target.length(); re++) stack.add(target.charAt(re));
                            break;
                        }
                        if (stack.getLast() != target.charAt(i)) {
                            // fail
                            // 다시 넣어주는 과정 : repush 
                            for (int re = i + 1; re < target.length(); re++) stack.add(target.charAt(re));
                            break;
                        } else {
                            // pop ( 현재 글자는 성공 -> pop ) 
                            stack.pollLast();
                        }
                    }
                }else{
                    stack.add(src.charAt(j));
                }
            }
            while(stack.isEmpty()==false){
                sb.append(stack.pollFirst());
            }
            if(sb.length()==0)sb.append("FRULA");
            bw.write(sb.toString());
            bw.flush();
            bw.close();
            br.close();
        }
        public static void main(String[] args)throws IOException {
            setting();
            solve();
    
        }
    }