【ABC320】FortranでA,B,C問題

## A - Leyland Number
### 問題
正整数 
A,B が与えられます。
$A^B+B^A$の値を出力してください。

>**制約**
>1. $2≤A≤B≤9$
>2. 入力される数値はすべて整数

詳細はこちらです。

https://atcoder.jp/contests/abc320/tasks/abc320_a


### 解説
**【フローチャート】**
入力に従い$A^B+B^A$を計算します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/001dca73-c79c-eafb-4aec-8a9e55f64491.png" width=40%>


### プログラム例
```Fortran
program abc320a
    implicit none
    integer A, B, Ans

    read (*, *) A, B
    Ans = A**b+B**A
    write(*,*)Ans

end program abc320a
```



## B - Longest Palindrome
### 問題
文字列$S$が与えられます。 $S$の連続する部分文字列のうち、回文であるものの長さの最大値を求めてください。

>**制約**
>1. $S$は長さ$2$以上$100$以下の英大文字からなる文字列

詳細はこちらです。

https://atcoder.jp/contests/abc320/tasks/abc320_b


### 解説
**【フローチャート】**

<details><summary>長いので折りたたみます</summary><div>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/441fa9d2-ca0a-ab4f-d07d-3d075a4940b7.png" width= 65%>
</div></details>

**【補足】**
※1
回文の検証に使用したい範囲を**超過していないか**を判定します。

入力する文字列の長さは**1〜100文字**なので、格納用の配列$S$は100文字分用意しています。 
入力時に余った部分は空白が入ります。

回文の検証に使用したい範囲は文字が格納されている箇所までなので、
$S(i:i)$に空白が格納されている時点で処理を終了させます。

※2
回文が成立しているかを判定します。
判定は、**$S(i:i)$ を中心に置き、そこから左右に１文字ずつ**文字が一致しているかを調べます。

>**判定する順番のイメージ**
> $4,3,2,1,S(i:i),1,2,3,4$

※3
回文が成立している最大の長さを更新します。
最大値の比較には``MAX関数``を使用します

※4
回文の検証に使用したい範囲を**超過していないか**を判定します。

回文の検証に使用したい範囲は文字が格納されている箇所までなので、
$S(i:i)とS(i+1:i+1)$に空白が格納されている時点で処理を終了させます。

※5
回文が成立しているかを判定します。
判定は、**中心に文字を置かずに、左右に１文字ずつ**文字が一致しているかを調べます。

>**判定する順番のイメージ**
> $4,3,2,1,1,2,3,4$


### プログラム例
```Fortran
program abc320b
    implicit none
    integer i, j, length, cnt
    character(100) S

    !読み込み
    read (*, *) S

    !回文の長さ測定
    length = 1
    do i = 1, len(S)
        cnt = 1
        if (S(i:i) == '') exit
        do j = 1, len(S)
            if (i - j < 1 .or. i + j > len(S)) exit
            if (S(i - j:i - j) /= S(i + j:i + j)) exit
            cnt = cnt + 2
        end do
        length = max(length, cnt)

        if (S(i:i) == S(i + 1:i + 1)) then
            cnt = 2
        else
            cycle
        end if
        do j = 1, len(S)
            if (i - j < 1 .or. i + j + 1 > len(S)) exit
            if (S(i - j:i - j) /= S(i + j + 1:i + j + 1)) exit
            cnt = cnt + 2
        end do
        length = max(length, cnt)
    end do

    !結果の出力
    write (*, '(i0)') length
end program abc320b
```



## C - Slot Strategy 2 (Easy) 
### 問題
数字のみで構成される長さ M のリールが 3 個からなるスロットがあります。

スロットが回り始めてからちょうど t 秒後にボタンを 1 つ選んで押す、または何もしないことができます。
ボタンを押した場合は　$mod(t,M)+1$ 文字目を表示して止まります。

全てのリールを同じ数字で止めるためには、最小で何秒かかるかを求めてください。

>**制約**
>1. $1≤M≤100$
>2. M は整数
>3. S_iは数字のみからなる長さ M の文字列

詳細はこちらです。

https://atcoder.jp/contests/abc320/tasks/abc320_c


### 解説
**【フローチャート】**
<details><summary>長いので折りたたみます</summary><div>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3259514/e5e199a8-14c6-10d1-14d6-212e3edf74ab.png" width= 70%>
</div></details>

**【補足】**
※1
リールを止める時間は ``mod`` により制御されるため、**M 秒で結果が１周**します。
**M+1 秒以降は調べる必要はありません。**

1 つのリールと止める時間の最大は 100秒(M=100)なので、**0〜300　秒**まで調べれば3つのリールの全てのパターンを調べることができます。

※2
**１度に止められるリールは1つです。**
同時に複数のリールを止めることはないので、$t1=t2,t2=t3,t1=t3$の時は``cycle文``により処理を飛ばします。

※3
**全てのリールが一致している場合**、経過時間の最小時間を更新します。
経過時間は t1 , t2 , t3 のうち、**一番最後に止めた時間**になります。

### プログラム例
```Fortran
program abc320c
    implicit none
    integer M, t1, t2, t3, tmp(3), ans
    character(:), allocatable:: S(:)
    character(1) slot(3)

    !読み込み
    read (*, *) M
    allocate (character(M):: S(3))
    read (*, *) S(1)
    read (*, *) S(2)
    read (*, *) S(3)

    !スロットを回す
    ans = 777777777
    do t1 = 0, 300
        tmp(1) = mod(t1, M) + 1
        slot(1) = S(1) (tmp(1):tmp(1))
        do t2 = 0, 300
            if (t1 == t2) cycle
            tmp(2) = mod(t2, M) + 1
            slot(2) = S(2) (tmp(2):tmp(2))
            if (slot(1) /= slot(2)) cycle
            do t3 = 0, 300
                if (t1 == t3) cycle
                if (t2 == t3) cycle
                tmp(3) = mod(t3, M) + 1
                slot(3) = S(3) (tmp(3):tmp(3))
                if (slot(2) /= slot(3)) cycle
                ans = min(ans, max(t1, t2, t3))
            end do
        end do
    end do

    !結果の出力
    if (ans == 777777777) then
        write (*, '(i0)') - 1
    else
        write (*, '(i0)') ans
    end if
end program abc320c
```


## 感想
- 回文の問題に苦戦しました。苦手なので回文用のサブルーチンを作っておきたい。