题目链接: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; }