寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #anagram - アナグラム (Anagram)

2007年 日本情報オリンピック春合宿OJから、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#anagram - アナグラム (Anagram)

https://atcoder.jp/contests/joisc2007/tasks/joisc2007_anagra

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#anagram - アナグラム (Anagram)
https://atcoder.jp/contests/joisc2007/tasks/joisc2007_anagra
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll arr[30];
ll f(string s){
  ll r=arr[s.size()];
  map<char,ll> m;
  for(auto &i : s){
    m[i]++;
  }
  for(auto &i : m){
    r/=arr[i.second];
  }
  return r;
}
int main(void){
  string s;
  cin>>s;
  ll ans=0;
  arr[0]=1;
  for(ll i=1;i<21;i++){
    arr[i]=arr[i-1];
    arr[i]*=i;
  }
  ll n=s.size();
  for(ll i=0;i<n;i++){
    map<char,bool> m;
    for(ll j=i;j<n;j++){
      if(s[j]<s[i] && !m[s[j]]){
        ans+=f(s.substr(i,j-i)+s.substr(j+1,n-j));
        m[s[j]]=true;
      }
    }
  }
  cout<<ans+1<<endl;
  return 0;
}