結果
| 問題 |
No.805 UMG
|
| コンテスト | |
| ユーザー |
Micc
|
| 提出日時 | 2019-03-22 22:03:00 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 20 ms / 2,000 ms |
| コード長 | 2,899 bytes |
| コンパイル時間 | 1,505 ms |
| コンパイル使用メモリ | 160,280 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-18 13:21:38 |
| 合計ジャッジ時間 | 2,735 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(i, n) for (ll i = 0; i < n; i++)
#define FOR(i, a, b) for (ll i = a; i < b; i++)
#define is(a, b) a == b
#define len(v) ll(v.size())
const ll INF = 1LL << 58;
class UnionFind{
public:
vector<int> par;//親の番号
vector<int> rank;//木の深さ
UnionFind(int n){//全ての要素に対して自身が根となるように初期化, 木の深さは0になる
rep(i,n){
par.push_back(i);
rank.push_back(0);
}
}
int find(int x) {//木の根を求める
if(par[x]==x){
return x;
}else{
return par[x]=find(par[x]);
}
}
void unite(int x,int y){//xとyの属する集合を併合
x=find(x);
y=find(y);
if(x==y) return;
if(rank[x]<rank[y]){//木の深さが小さい方を大きい方へ繋げる
par[x]=y;
}else{
par[y]=x;
if(rank[x]==rank[y]) rank[x]++;
}
}
bool same(int x,int y){//xとyが同じ集合に属するか否か
return find(x)==find(y);
}
};
//x以下の要素への最小index, ソートしてから使ってね
template <class T>
int former(const vector<T> &v, T x){
return upper_bound(v.begin(), v.end(), x) - v.begin() - 1;
}
//x以上の要素への最小index
template <class T>
int latter(const vector<T> &v, T x){
return lower_bound(v.begin(), v.end(), x) - v.begin();
}
//vector書き出し
template <class T>
void cout_vec(const vector<T> &vec1){
rep(i,len(vec1)){
cout<<vec1[i]<<' ';
}
cout<<'\n';
}
//nCk
template <class T>
T comb(T n,T k){
T ans=1;
FOR(i,n-k+1,n+1){
ans*=i;
}
FOR(i,1,k+1){
ans/=i;
}
return ans;
}
//a,bの最大公約数
template <class T>
T gcd(T a,T b){
if (b == 0) return a;
else return gcd(b, a % b);
}
//素因数分解
template <class T>
map<T,T> prime_factor(T x){
map<T,T> ans;
for(T i=2;i*i<=x;i++){
while(x%i==0){
x/=i;
ans[i]++;
}
}
if (x!=1){
ans[x]=1;
}
return ans;
}
//約数列挙
template <class T>
vector<T> divisor(T x){
vector<T> res;
for(T i=1;i*i<=x;i++){
if(x%i==0){
res.push_back(i);
if(i!=x/i){
res.push_back(x/i);
}
}
}
return res;
}
//素数判定
template <class T>
bool is_prime(T x){
for(T i=2;i*i<=x;i++){
if(x%i==0){
return false;
}
}
return x!=1;
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
int n;
cin>>n;
string s;
cin>>s;
int ans=0;
rep(i,n-2){
FOR(j,i+1,n-1){
int k=2*j-i;
if(s[i]=='U' && s[j]=='M' && s[k]=='G'){
ans++;
}
}
}
cout<<ans<<endl;
}
Micc