PKU 1782 Run Length Encoding

http://poj.org/problem?id=1782
与えられた文字列を指示に従って処理する。
2以上9以下の連続した文字は連続した文字数とその文字に変換し、10以上の連続は9の連続とその後で分ける。
また、連続して出現しない文字は連続していない部分を1で囲む。その中に1がある時は11にして出力する。

場合分けで若干混乱。

main(){
  string in;
  while(getline(cin,in)){
    for(int p=0;p<SZ(in);){
      if(p+1<SZ(in) && in[p+1]==in[p]){
        int i=0;
        while(p+i<SZ(in) && i<9 && in[p]==in[i+p])++i;
        --i;
        cout<<i+1<<in[p];
        p+=i+1;
      }else{
        int i=0;
        while(p+i+1<SZ(in) && in[p+i]!=in[p+i+1])++i;
        if(p+i+1<SZ(in))--i;
        
        cout<<1;
        for(int j=p;j<=p+i;j++){
          cout<<in[j];
          if(in[j]=='1')cout<<1;
        }
        cout<<1;
        p+=i+1;
      }
    }
    cout<<endl;
  }
}