题目
分析
用栈来存储每次操作之后的结果,出栈代表回滚到上一次操作
字符串不大,可以用栈来存储每次的操作后的结果,出栈后的栈顶为上次操作之前的字符串。 维护一个当前字符串S。
操作1:把S与要加的字符串相连,然后入栈。 操作2:按题意来更新S,然后入栈。
操作3:直接输出当前S的第k个字符。操作4:出栈回滚,更新当前字符串S。
PS:是多组输入,快读快输(开始没看到,被坑到吐QAQ)
代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Stack;
import java.util.StringTokenizer;
public class 小C第二 {
public static void main(String[] args) {
while(sc.hasNext()) {
int t=sc.nextInt();Stack<String> d=new Stack<>();
int q,n,m;
String S="",s="";
d.add(S);d.add(s);
while(t-->0) {
q=sc.nextInt();
if(q==1) { //操作一
s=sc.next();
S+=s;d.add(S);
}else if(q==2) { //操作二
m=sc.nextInt();
S=S.substring(0,S.length()-m);
d.add(S);
}else if(q==3) { //操作三
n=sc.nextInt();
out.println(S.charAt(n-1));
}else { //操作四
d.pop();S=d.peek();
}
}
out.flush();
}
}
//------------------用于快速读入大量数据----------------------------------
static class FastScanner{
BufferedReader br;
StringTokenizer st;
public FastScanner(InputStream in) {
br = new BufferedReader(new InputStreamReader(in),16384);
eat("");
}
public void eat(String s) {
st = new StringTokenizer(s);
}
public String nextLine() {
try {
return br.readLine();
} catch (IOException e) {
return null;
}
}
public boolean hasNext() {
while(!st.hasMoreTokens()) {
String s = nextLine();
if(s==null) return false;
eat(s);
}
return true;
}
public String next() {
hasNext();
return st.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
}
static FastScanner sc = new FastScanner(System.in);//快读
static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));//快速输出
}