EOJ Monthly 2017.12 이 위 구조 (욕심 + STL 특성 용기 + 헤더 파일) 미 해결

이 위 구사 (anagram) 한 단어 에 있 는 자 모 를 다시 배열 하 는 것 을 말한다. 원래 단어 에 있 는 모든 자모 가 나타 나 고 한 번 밖 에 없다.예컨대 "unce" 이 위 "ecnu"。어떤 상황 에서 재 배열 을 요구 하 는 것 은 여전히 하나의 단어 이지 만 본 문 제 는 이런 요구 가 없다. 왜냐하면 우 리 는 사전 이 전혀 없 기 때문이다.우리 가 흥 미 를 느끼 는 것 은 어떤 단어 중의 자모 가 적당 한 정렬 을 한 후에 구 성 된 단어 가 대응 하 는 위치 마다 자모 가 다 를 수 있다 는 것 이다.예컨대 "unce" 화해시키다 "ecnu" "u" ≠ "e", "n" ≠ "c", "c" ≠ "n", "e" ≠ "u"。이제 이런 재배 열 이 있 는 지 물 어 보 는 단 어 를 드 립 니 다.
Input
한 줄 한 단어 s (1≤|s|≤105)。단어 26 소문 자 알파벳 구성
Output
단 어 를 출력 합 니 다.다 분해 가 있 으 면 출력 을 임의로 풀 어 줍 니 다.존재 하지 않 으 면 출력 impossible。
Examples input
unce output
ecnu input
aaaaaa output
impossible 
사고방식: 욕심 이 많 고 횟수 가 가장 많은 문자열 이 가장 처리 하기 어렵다. 경기 에서 이 처리 가 부적 절하 기 때문에 다른 사람의 블 로 그 를 본 후에 횟수 가 가장 많은 알파벳 을 횟수 가 가장 적은 알파벳 에 놓 고 횟수 가 많은 것 과 횟수 가 많은 것 을 가장 많은 위치 에 기입 하도록 한다. 
예:
5 4 3 2 1
4 3 2 1 5   (숫자 는 알파벳 자 체 를 대표 하 는 것 이지 횟수 가 아니다)
#include   //
using namespace std;
string s;
int main(){
	while(cin >> s){
	int cnt[26],flag=0;
	memset(cnt, 0, sizeof(cnt));
	for(int i = 0; i < s.size(); ++i){ //            
		cnt[s[i] - 'a']++;
	}
	vector > g;   //     pair    
	for(int i = 0; i < 26; ++i){
		if(cnt[i] > 0){
			g.push_back(make_pair(cnt[i], i));  //                
		}
	}
	sort(g.begin(), g.end());    //            sort   
	reverse(g.begin(), g.end());   //  ,        
	string cur = "";               //         
	for(int i = 0; i < g.size(); ++i){
		for(int j = 1; j <= g[i].first; ++j){
			cur += 'a' + g[i].second;      //                     
		}
	}
	string ans = "";    //         
	int pos = g[0].first;
	int i = pos;          //           
	while(i < cur.size()){   //                 cur    ans
		ans =ans+ cur[i++];
	}
	i = 0;
	while(i < pos){
		ans += cur[i++];   //               ans  
	}
	vectorx[26];      //    x[26][]   
	for(int i = 0; i < ans.size(); ++i){
		x[cur[i] - 'a'].push_back(ans[i] - 'a');//x[cur  ][]=ans cur ans  
	}
	int poss[26];
	memset(poss, 0, sizeof(poss));
	string res = "";   //         
	for(int i = 0; i < s.size(); ++i){
		res+='a' + x[s[i] - 'a'][poss[s[i] - 'a']++];//poss 0    
	}  // res+=            res=res+       
	for(int i = 0; i < s.size(); ++i){
		if(s[i] == res[i]){
			cout<
\ # include 이 헤더 파일 은 다음 과 같은 C + + 에 포 함 된 모든 헤더 파일 을 포함 합 니 다. 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include

좋은 웹페이지 즐겨찾기