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 (GCC 5.4.1) (judge verdict: Accepted)

#define R(i,r)for(int i=0;i<r;i++)
#define P(x,y)x=(x+y)%998244353
b,N,f,A,s[3],dp[1<<18][3][3][2];
main(c){
	for(;read(0,&c,1),c-10;N++)s[c-'a']++,f|=b==c,b=c;
	dp[0][0][0][0]=dp[0][1][1][0]=dp[0][2][2][0]=1;
	R(n,N-1)R(i,3)R(j,3)R(k,2)R(d,3)P(dp[n+1][d][(j+d)%3][k|(i==d)],dp[n][i][j][k]);
	R(i,3)P(A,dp[N-1][i][(s[1]+2*s[2])%3][1]);P(A,!f);
	printf("%d\n",!s[0]+!s[1]+!s[2]>1?:N<4?(s[0]|s[1]|s[2])&2?6+!f:N:A);
}