F Tokitsukaze and Eliminate (hard)
一开始用的是栈和set来写,结果看题解只需要用map就行了
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
//typedef long long ll;
const int mod = 1000000007;
const int N = 2e5 + 10;
//int 类型最小-2147483647
int n,a[N];
void solve()
{
cin>>n;
map<int,int>b,c;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[a[i]]++;//给每种宝石计数
}
int res=0;
for(int i=n;i>=1;i--)
{
b[a[i]]--;
c[a[i]]++;
if(!b[a[i]])
{
b.erase(a[i]);
c.erase(a[i]);
}
if(b.size()==c.size())
{
res++;
c.clear();
}
}
cout<<res<<endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T=1;
cin >> T;
while(T--)
solve();
return 0;
}
K Tokitsukaze and Password (easy)
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
// typedef long long ll;
const int mod = 1000000007;
const int N = 2e5 + 10;
// int 类型最小-2147483647
map<int, bool> mp;
void solve()
{
mp.clear();
int n, y;
cin >> n;
string s;
cin >> s;
cin >> y;
for (char a = '0'; a <= '9'; a++){
for (char b = '0'; b <= '9'; b++){
for (char c = '0'; c <= '9'; c++){
for (char d = '0'; d <= '9'; d++){
for (char _ = '0'; _ <= '9'; _++){
if (a == b || a == c || a == d || b == c || b == d || c == d) continue;
string str = s;
for (int i = 0; i < n; i++)
{
if (str[i] == 'a')str[i] = a;
if (str[i] == 'b')str[i] = b;
if (str[i] == 'c')str[i] = c;
if (str[i] == 'd')str[i] = d;
if (str[i] == '_')str[i] = _;
}
if (n > 1 && str[0] == '0') continue;
int res = stoi(str);//转为十进制
if (res <= y && (res % 8)==0)
{
mp[res] = true;
}
}
}
}
}
}
cout << mp.size() << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T = 1;
cin >> T;
while (T--)
solve();
return 0;
}