题意:
给一个字符串 S ,求与其相似的字符串 T 的个数:

相似的定义:

1.两个字符串单词的个数相同。

2.对于一个词 a ,它在字符串 S 中的第 i 次出现和在 字符串T 中的第 i 次出现的指数相差不超过1。
思路:
如果 a[i]==a[i−1] ,a[i] 和 a[i−1] 不必交换,那么 f[i]=f[i−1] 。

如果 a[i]!=a[i−1] ,那么 f[i]=f[i−1]+f[i−2] 。f[i-1]继承前面相似情况个数,f[n-2]代表交换a[i]与a[i-1]后前面相似情况个数.

#include<iostream>
#include<string>
using namespace std;

const int N = 100005, mod = 1e9 + 7;
int f[N], n;// f[i] 为前 i 个单词所组成的字符串的相似但本质不同的字符串的个数
string s[N];
int main() {
    int T;
    cin >> T;
    for (int i = 1; i <= T; i++) {
        cin >> n;
    for (int i = 1; i <= n; i ++) {
        cin >> s[i];
    }
    fill(f, f + n + 1, 0);
    f[0] = 1;
    for (int i = 1; i <= n; i ++) {
        f[i] = f[i - 1];
        if (i >= 2 && s[i] != s[i - 1]) {
            f[i] = (f[i] + f[i - 2]) % mod;
        }
    }
    cout<<f[n]<<endl;
    }
    return 0;
}