A 计算最大前缀即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int T;
cin>>T;
while(T--)
{
string s1,s2;
cin>>s1>>s2;
int sum=0;
for(int i=0;i<min(s1.size(),s2.size());i++)
{
if(s1[i]==s2[i])
sum++;
else break;
}
//cout<<sum<<endl;
if(sum)
cout<<s1.size()-sum+s2.size()-sum+sum+1<<endl;
else
cout<<s1.size()-sum+s2.size()-sum+sum<<endl;
}
}
B
模拟发现即求2次幂 快速幂即可
# include <bits/stdc++.h>
using namespace std;
#define int long long
int t;
const int N=1e5+10,mod=1e9+7;
int n[N],k[N];
int qmi(int a, int k, int p) // 求a^k mod p
{
int res = 1 % p;
while (k)
{
if (k & 1) res = res * a % p;
a = a * a % p;
k >>= 1;
}
return res;
}
signed main()
{
cin>>t;
for(int i=1;i<=t;i++)
cin>>n[i];
for(int i=1;i<=t;i++)
cin>>k[i];
for(int i=1;i<=t;i++)
cout<<qmi(2,k[i],mod)<<endl;
}
C
主要考察单调队列应用
我们首先需要用一个map去统计每个数出现的次数,然后快排一下,去重。跑一遍单调队列,我们在单调队列中去处理结果.我们用sum去表示过程中的值,ans表示最终的最大值。
首先查看是否满足序列连续,如果不连续计算前面一段连续既可。
当插入的值和第一个元素的值差值大于等于k,说明插入的元素要多于k了,因此我们需要将队首元素弹出,并且sum-队首元素的次数。
#include<bits/stdc++.h>
using namespace std;
int t;
int n, k;
int a[200005];
map<int, int> mp;
struct node
{
int x;
int cnt;
};
deque<node> que;
void solve()
{
cin >> n >> k;
mp.clear();
for(int i = 1; i <= n; i++)
{
cin >> a[i];
mp[a[i]]++;
}
sort(a + 1, a + 1 + n);
int len = unique(a + 1, a + 1 + n) - (a + 1);
vector<node> q(len + 1);
for(int i = 1; i <= len; i++)
{
q[i].x = a[i];
q[i].cnt = mp[a[i]];
}
int sum = 0;
int ans = 0;
for(int i = 1; i <= len; i++)
{
if (!que.empty() && q[i].x - 1 != que.back().x)
{
ans = max(ans, sum);
sum = 0;
while (!que.empty())
{
que.pop_back();
}
}
while (!que.empty() && que.front().x<=q[i].x-k)
{
ans = max(ans, sum);
sum -= que.front().cnt;
que.pop_front();
}
que.push_back(q[i]);
sum += q[i].cnt;
ans = max(ans, sum);
}
cout << ans << "\n";
while (!que.empty())
{
que.pop_back();
}
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t--)
solve();
return 0;
}