ぱーぽーの競プロ記

競技プログラミングに関することを書きます。

AOJ 1101 A Simple Offline Text Editor

問題文はこちら
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1101


・概要
タイトルの通りシンプルなテキストエディタを実装する問題です。

コマンドは、
・forward char
・forward word
・backward char
・backward word
・insert "any-text"
・delete char
・delete word
の計7つあります。


・解法
実装問題です。

文字列の追加・削除など、バグを埋め込みやすい問題なので注意して実装する必要があります。
※私もこの問題はPEを連発してしまいました。 原因は文字列を削除するときにうまく空白を消せていなかったことです。


ソースコード

#include<iostream>
#include<string>
#include<cctype>
using namespace std;

#define rep(i,n) for(int i = 0 ; i < (int)(n) ; i++)

string s;
int pos;

void forward_char(){
   if(pos!=s.size())pos++;
}

void forward_word(){
   if(pos!=s.size()){
      while(pos!=s.size() && isspace(s[pos]))pos++;
      while(pos!=s.size() && !isspace(s[pos]))pos++;
   }
}

void backward_char(){
   if(pos!=0)pos--;
}

void backward_word(){
   if(pos!=0){
      while(pos!=0 && isspace(s[pos-1]))pos--;
      while(pos!=0 && !isspace(s[pos-1]))pos--;
   }  
}

void delete_char(){
   if(pos!=s.size()) s.erase(pos,1);
}

void delete_word(){
   int sz = 0;
   while(pos + sz < s.size() && isspace(s[pos+sz]))sz++;
   if(pos+sz==s.size())return;
   while(pos + sz < s.size() && !isspace(s[pos+sz]))sz++;
   s.erase(pos,sz);
}

void insert_word(string word){
   s.insert(pos,word);
   pos+=word.size();
}

int main(){
   int T;
   cin >> T;
   cin.ignore();
   while(T--){
      getline(cin, s);
      pos = 0;
      
      int n;
      cin >> n;
      cin.ignore();
      rep(i,n){
	 string op;
	 getline(cin, op);
	 if(op=="forward char")forward_char();
	 else if(op=="forward word")forward_word();
	 else if(op=="backward char")backward_char();
	 else if(op=="backward word")backward_word();
	 else if(op=="delete char")delete_char();
	 else if(op=="delete word")delete_word();
	 else{//insert
	    string tmp = op.substr(8);
	    tmp.erase(tmp.size()-1);
	    insert_word(tmp);
	 }
      }
      
      s = s.substr(0,pos) + "^" + s.substr(pos);
      cout << s << endl;
   }
   return 0;
}