AOJ 0130 - Train

1文字対策で解決.最大値だけが敵ではないですね.
適当な文字から初めて先頭を求めます.そして,逆順すれば答えとなります.
この解法結構好きだ.

#include <iostream>
#include <map>
int main(){
	int n;
	std::cin >> n;
	std::string s;
	while(n--){
		std::cin >> s;

		if(s.size() == 1){//1文字対策
			std::cout << s << std::endl;
			continue;
		}

		int pos = 0;
		while(pos = s.find("-", pos), pos != std::string::npos){
			s.replace(pos, 1, "");
		}

		std::map<char, char> m, rm;
		for(int i=1;i<s.size();i+=2){
			if(s[i] == '>')
				m[s[i+1]] = s[i-1], rm[s[i-1]] = s[i+1];
			else
				m[s[i-1]] = s[i+1], rm[s[i+1]] = s[i-1];
		}

		char end = (*m.begin()).first;
		while(m[end] != '\0'){
			end = m[end];
		}
		//while終了時点でendはstartとなる

		while(rm[end] != '\0'){
			std::cout << end;
			end = rm[end];
		}
		std::cout << end << '\n';
	}
}