Monday, February 7, 2011

TopCoder SRM 337, DIV II, AnagramList

Problem Statement

An anagram of a string is any string that contains the same characters in any order. For example, the anagrams of "tree" are, in alphabetical order: "eert", "eetr", "eret", "erte", "eter", "etre", "reet", "rete", "rtee", "teer", "tere" and "tree".

You will be given a String s and an int i. Return the ith (0-based) anagram of s when listed in alphabetical order. If there is no such anagram, return an empty String.



#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <list>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <bitset>
#include <algorithm>
#include <sstream>
using namespace std;
typedef long long int lli;
typedef long unsigned long llu;
#define mem_prep(varx) memset(varx,0,sizeof(varx))
#define pb push_back
#define mp make_pair
#define sz(v) ((int)(v).size())
#define rep(i,a,n) for(int i=(a);i<(n);i++)
#define repe(i,a,n)  for(int i=(a);i<=(n);i++)
#define forsz(i,a,v) rep(i,a,sz(v))
#define repsz(i,v) rep(i,0,sz(v))

bool func(string i, string j){
  return i<j;
}

class AnagramList {

public:

  string getAnagram(string s, int i) {
    string ans;
    sort(s.begin(),s.end());
    int n = 1;
    ans = s;
    bool flag = (i!=0);
    while(next_permutation(s.begin(),s.end())){
      if(n==i){ans = s;flag = 1;n--;break;}
      n++;
    }
    if(n>=i)flag=0;
    return ((flag)?ans:"");
  }

No comments:

Post a Comment