A - Yay!
大意
给定字符串,其中有且仅有一个字符与其他不同,输出这个字符的下标(从1开始)。
思路
桶排序统计次数即可。
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){string s;cin >> s;vector<int> a(26, 0);for(int i = 0; i < s.size(); i++) a[s[i] - 'a']++;for(int i = 0; i < s.size(); i++){if(a[s[i] - 'a'] == 1){cout << i + 1 << endl;break;}}return 0;
}
B - Which is ahead?
大意
有 个人排成一列,从前往后第个位置的人是编号为的人。下标从1开始。
请处理个查询,每个查询如下:
- 给定两个整数和。在编号为的人和编号为的人中,输出站在更前面的那个人的编号。
思路
记录一下每个人的下标,然后对于每个询问比较下标大小即可。
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){ios::sync_with_stdio(0);int n, q;cin >> n;vector<int> a(n);for(int i = 0; i < n; i++){cin >> q;a[q - 1] = i;}cin >> q;while(q--){int x, y;cin >> x >> y;if(a[x - 1] < a[y - 1]) cout << x << endl;else cout << y << endl;}return 0;
}
C - Many Replacement
大意
给定一个长度为的字符串,进行次操作。
每次操作, 将所有的字符替换成字符。
输出最后的字符串。
思路
朴素做法的复杂度是,会超时。
我们可以建立一个映射表,每次只需要修改映射表,最后才进行替换。
代码
#include<iostream>
using namespace std;
int main(){ios::sync_with_stdio(0);int n, q;string s;cin >> n >> s;cin >> q;string from, to;from = to = "abcdefghijklmnopqrstuvwxyz";while(q--){char c, d;cin >> c >> d;for(int i = 0; i < 26; i++)if(to[i] == c) to[i] = d;}for(int i = 0; i < n; i++){for(int j = 0; j < 26; j++)if(s[i] == from[j]) cout<<to[j];}return 0;
}
D - Square Pair
大意
一个长度为的自然数序列。求满足以下两个条件的整数对的个数:
-
是一个完全平方数。(0也是完全平方数)
思路
考虑两个自然数,如果是完全平方数,只有两种情况:
- 或,此时。
- 是完全平方数且不为0。
并且易得。
所以一个完全平方数因子对 是不是完全平方数没有影响。我们可以把和分别除掉所有完全平方数因子,得到和。由于它们没有完全平方数因子(除了1),所以只有时,才是完全平方数。
因此,我们把所有除去所有完全平方数因子,然后遍历。
每个只有两种情况:
- ,那么它与前面和相同的数以及0可以组成一个平方数对。
- ,那么它与前面所有数都可以组成一个平方数对。
开个map,一边统计次数,一边计算答案即可。
代码
#include<iostream>
#include<vector>
#include<unordered_map>using namespace std;
#define int long longsigned main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n;cin >> n;vector<int> a(n + 1, 0);auto divide = [&](int x){for(int i = 2; i <= x / i; i++)while(x % (i * i) == 0) x /= (i * i);return x;};for(int i = 1; i <= n; i++){cin >> a[i];a[i] = divide(a[i]);}int ans = 0;unordered_map<int, int> times;for(int i = 1; i <= n; i++){if(a[i]) ans += times[a[i]] + times[0];else ans += i - 1;times[a[i]]++;}cout << ans << endl;return 0;
}