C++ 代码实现 输入一个字符串 S,对于所有 S 的非空子串,求出每个子串中不同字符的种类数,并求出这些数字的平方和,输出这个数字的最后四位。
时间: 2024-03-22 22:36:53 浏览: 149
好的,我来给你提供一个 C++ 代码实现。这道题可以使用滑动窗口算法来解决。
具体思路是,我们维护一个滑动窗口,通过移动左右指针,来枚举所有的非空子串。对于每个子串,我们使用一个哈希表来记录其中不同字符的种类数。最后,我们将所有子串的不同字符的种类数的平方和相加,然后输出结果的最后四位。
以下是代码实现:
```c++
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
string s;
cin >> s;
unordered_map<char, int> freq;
int n = s.size();
long long ans = 0;
int mod = 10000; // 取模数
for (int i = 0, j = 0; i < n; i++) {
while (j < n && !freq.count(s[j])) { // 向右扩展右边界
freq[s[j]]++;
j++;
}
ans += freq.size() * freq.size(); // 更新答案
ans %= mod;
freq[s[i]]--; // 缩小左边界
if (freq[s[i]] == 0) {
freq.erase(s[i]);
}
}
cout << ans << endl;
return 0;
}
```
这段代码中,我们使用了 `unordered_map` 来记录每个子串中不同字符的种类数。在滑动窗口中,我们首先将右指针向右移动,扩展当前的子串。然后,我们计算当前子串的不同字符的种类数,更新答案。接着,我们将左指针向右移动,缩小子串的大小,同时更新哈希表中的计数器。
最后,我们输出答案的最后四位即可。
阅读全文