Yandex.Algorithm Open 2011: Qualification 1 B. Sequence Formatting (模拟)

题意:给定由数字,逗号,省略号(3个点)组成的字符串,要求输出规范格式后的字符串。

思路:简单模拟题,需要注意一些细节。

数字之后如果没有逗号需要空格。

如果省略号在开头则前面不需要加空格。

如果逗号后面是省略号则它们之间只能有一个空格。

字符串末尾不能有空格,如最后一个符号是逗号或者数字。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define il inline
string s,ans;
int main(){
	getline(cin,s);
	int n=s.size();
	for(int i=0;i<n;){
		int num=0;
		while(i<n&&s[i]==' ') i++;
		if(isdigit(s[i])){
		while(i<n&&isdigit(s[i])){
			ans+=s[i++];
		}
		if(isdigit(ans.back())) ans+=" ";
		}
		while(i<n&&s[i]==','){
			if(ans.size()>1&&ans.back()==' '&&isdigit(ans[ans.size()-2])) ans.pop_back();
			ans+=", ";
			i++;
		}
		if(s[i]=='.'){
		int cnt=0;
		while(i<n&&s[i]=='.'){
			cnt++;
			if(cnt==3){
				if(ans.empty()) ans+="...";
				else if(ans.back()!=' ')
				ans+=" ...";
				else ans+="...";
				cnt=0;
			}
			i++;
		}
			}
	}
	n=ans.size();
	if(ans[n-1]==' ') ans.pop_back();
	cout<<ans<<endl;
	return 0;
}

总结:模拟题的 W A WA WA点就是细节和特殊情况的考虑。