题解:P2030 遥控车

第一问(怎么都用二分?怎么都用二分?怎么都用二分?

用哈希 + unordered_map 秒了。

建议不要用 map,实测超慢。

第二问

打个表你会发现是斐波那契数列,但是具体为什么?

\(f_i\) 为以第 \(i\) 辆车结尾的可能排列数。

可以发现放错了就是交换相邻两个车,然后我们对于最后一个车分讨一下。

  • 原地不动,那么继承 \(f_{i-1}\) 的值。

  • 与上一个交换,那么只有前 \(i-2\) 个要排,继承 \(f_{i-2}\) 的值。

所以得 \(f_i = f_{i-1} + f_{i-2}\)

Code

#include <bits/stdc++.h>
using namespace std;
const long long base = 13331;
long long n, m, cnt, h[100005];
unordered_map<long long, bool> mp;
string jia(string a , string b){
	string c = "";
	int x[10005] = {} , y[10005] = {} , z[10005] = {};
	for(int i = a.size() - 1, j = 1; i >= 0; i--, j++)x[j] = a[i] - '0';
	for(int i = b.size() - 1, j = 1; i >= 0; i--, j++)y[j] = b[i] - '0';
	int len = max(a.size(), b.size());
	for(int i = 1; i <= len; i++){
		z[i] += x[i] + y[i];
		z[i + 1] += z[i] / 10; 
		z[i] %= 10;
	}
	if(z[len + 1] > 0) len++;
	for(int i = len; i >= 1 ; i--) c += char(z[i] + '0');
	return c;
}
string dp[100005];
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		string s;
		cin >> s;
		for(int j = 0; j < s.size(); j++){
			h[i] = h[i] * base + s[j];
			mp[h[i]] = 1;
		}
	}
	for(int i = 1; i <= m; i++){
		string s;
		cin >> s;
		long long x = 0;
		for(int j = 0; j < s.size(); j++){
			x = x * base + s[j];
		}
		if(mp.count(x)) cnt++;
	}
	cout << cnt << '\n';
    dp[0] = dp[1] = "1";
    for(int i = 2; i <= n; i++){
        dp[i] = jia(dp[i - 1], dp[i - 2]);
    }
	cout << dp[n];
	return 0;
}
posted @ 2025-07-21 12:57  KukCair  阅读(5)  评论(0)    收藏  举报