Problem:
Score : 700 points

Problem Statement

You are given a string S consisting of a,b and c. Find the number of strings that can be possibly obtained by repeatedly performing the following operation zero or more times, modulo 998244353:

Choose an integer i such that 1\leq i\leq |S|-1 and the i-th and (i+1)-th characters in S are different. Replace each of the i-th and (i+1)-th characters in S with the character that differs from both of them (among a, b and c).

Constraints

2 \leq |S| \leq 2 × 10^5

S consists of a, b and c.

Input

Input is given from Standard Input in the following format:

S

Output

Print the number of strings that can be possibly obtained by repeatedly performing the operation, modulo 998244353.

Sample Input 1

abc

Sample Output 1

3

abc, aaa and ccc can be obtained.

Sample Input 2

abbac

Sample Output 2

65

Sample Input 3

babacabac

Sample Output 3

6310

Sample Input 4

ababacbcacbacacbcbbcbbacbaccacbacbacba

Sample Output 4

148010497

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define maxn 340000
#define M 998244353

using namespace std;
typedef long long ll;
ll dp[maxn][3][3],n,t,f,ans;
char s[maxn];

int main()
{
    scanf("%s",s); n=strlen(s); ans=1;
    f=1; for (int i=1;i<n;i++) f&=s[i]!=s[i-1],ans=ans*3%M;
    if (n==2) {cout << 1+(s[0]!=s[1]) << endl;return 0;}
    if (n==3) {
        if (s[0]==s[1]&&s[0]==s[2]) cout << 1 << endl;
        else if (s[0]!=s[1]&&s[1]!=s[2]&&s[0]!=s[2]) cout << 3 << endl;
        else cout << 6+f << endl;
        return 0;
    }
    if (f){
        for (int i=0;i<n;i++) t=(t+s[i]-'a')%3;
        for (int i=0;i<3;i++) dp[1][i][i]=i;
        for (int i=2;i<=n;i++)
            for (int j=0;j<3;j++)
                for (int k=0;k<3;k++)
                    for (int l=0;l<3;l++)
                        if (k!=l) (dp[i][(j+l)%3][l]+=dp[i-1][j][k])%=M;
        cout << ((ans-dp[n][t][0]-dp[n][t][1]-dp[n][t][2])%M+M+f)%M << endl;
    }
    else {
        t=1; for (int i=1;i<n;i++) t=t*2%M;
        cout << (ans-t+M)%M << endl;
    }
    return 0;
}