题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6806
题意:一个单词串S,问有多少个字符串与S几乎相等,输出个数
思路:几乎相等的条件为1.单词的可重集合相同 2.对于一个词 α ,它在 S 中的第 i 次出现和在 T 中的第 i 次出现的指数相差不超过1。

其实就是一简单dp 我们用dp[i]表示前i个单词中有多少个几乎相等的个数,比较单词串s中的每一个单词,当s[i]==s[i-1] 此时交换后不改变dp[i]=dp[i-1],当s[i]!=s[i-1],此时就会存在两种情况,即交换和不交换,我们用dp[i-1]和dp[i-2]表示,所以dp[i]=dp[i-1]+dp[i-2].避免结果太大 取模
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

const int N = 1e5 + 5, mod = 1e9+7;
int dp[N];
string s[N];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int t; cin >> t;
	while (t--) {
		int n; cin >> n;
		for (int i = 1; i <= n; i++) cin >> s[i];
		dp[0] = dp[1] = 1;
		for (int i = 2; i <= n; i++) {
			if (s[i] == s[i - 1])	dp[i] = dp[i - 1];
			else dp[i] = (dp[i - 1] + dp[i - 2])%mod;
		}
		cout << dp[n]%mod  << endl;
	}
	return 0;
}