Entries

スポンサーサイト (この記事を編集する[管理者用])

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1976-766f6858
この記事にトラックバックする(FC2ブログユーザー)

Yandex Open 2011 Qualification 1 B問題 - Sequence Formatting (この記事を編集する[管理者用])

Source

Yandex Open 2011 Qualification 1 B問題 (1000pt)
Problem description
Yandex Open 2011 Qualification 1の自分の参加記録

問題概要

正整数,「...」,「,」,「 」(半角スペース)のみからなる文字列が与えられる.
以下を満たすように整形する問題.
 (1) 「,」の後には1つの半角スペースをつける
 (2) 「...」の前には1つの半角スペースをつける
 (3) 2つの正整数の間に,1個以上の半角スペースしかない場合は,正整数の間はちょうど1個の半角スペースにする
 (4) それ以外の半角スペースはない
 (5) 行頭,行末は半角スペースをなくす.これはルール(1),(2)よりも優先させる

解法

うまく書きにくいのだけどやるだけ.
結局は置換しまくって解いた.

C言語のスパゲッティなコード
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

int replaceAll(char a[],int *as,char b[],int bs,char c[],int cs){
  int i,j;
  int AS = *as;
  int res=0;

  rep(i,AS-bs+1){
    rep(j,bs) if(a[i+j]!=b[j]) break;
    if(j!=bs) continue;

    AS += cs - bs;
    if(bs < cs){
      for(j=AS-1;j>=i+cs;j--) a[j] = a[j+bs-cs];
    } else if(bs > cs){
      for(j=i+cs;j<AS;j++) a[j] = a[j+bs-cs];
    }

    rep(j,cs) a[i+j] = c[j];
    i += cs-1;
    res++;
  }

  *as = AS;
  return res;
}

int main(){
  int i,j,k,l,m,n,st;
  char in[1000];

  while(gets(in)){
    for(i=0;;i++) if(in[i]<' ') break; n=i;

    while( replaceAll(in,&n,"  ",2," ",1) );
    while( replaceAll(in,&n,", ",2,",",1) );
    while( replaceAll(in,&n," ,",2,",",1) );
    while( replaceAll(in,&n,"... ",4,"...",3) );
    while( replaceAll(in,&n," ...",4,"...",3) );

    replaceAll(in,&n,",",1,", ",2);
    replaceAll(in,&n,"...",3," ...",4);
    while( replaceAll(in,&n,"  ",2," ",1) );

    while(n && in[n-1]==' ') n--;
    st = 0;
    while(st<n && in[st]==' ') st++;
    in[n]='\0'; puts(in+st);
  }

  return 0;
}

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/1976-766f6858
この記事にトラックバックする(FC2ブログユーザー)

Appendix

Recent Articles

ブログ内検索

Ads


(プライバシーポリシー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。