AT_agc031_b [AGC031B] Reversi 题解
设 $f_i$ 表示 $[1,i]$ 的石头能形成多少种序列,$p_i$ 表示当前 $i$ 的最后一次出现,
若不合并 $i$ 到 $p_{a_i}$,能形成 $f_{i-1}$ 种序列,若合并 $i$ 到 $p_{a_i}$,能形成 $f_{p_{a_i}}$ 种序列,
所以
$$ f_i= \begin{cases} f_{p_{a_i}}+f_{i-1}&p_{a_i}\ne0,p_{a_i}\ne i-1\\ f_{i-1}&\text{otherwise} \end{cases} $$
#include <cstdio>
#define int long long
int n, p[5000050], f[5000050];
signed main()
{
scanf("%lld", &n);
for (int i = f[0] = 1, x; i <= n; ++i)
{
scanf("%lld", &x);
f[i] = f[i - 1];
if (p[x] && p[x] != i - 1)
f[i] = (f[i] + f[p[x]]) % 1000000007;
p[x] = i;
}
printf("%lld", f[n]);
return 0;
}