contents:
D - String Formation
思路
模拟string即可
AC
#include <bits/stdc++.h>
using namespace std;
int q;
string s;
int inde, cc, tou; //翻转次数,命令,头还是尾巴
char c; //尾追字符
int main()
{
cin >> s >> q;
while (q--)
{
cin >> cc;
if (cc == 1)
inde++;
else
{
cin >> tou >> c;
if (tou == 1)
{
if (inde % 2 == 0)
s.insert(s.begin(), c);
else
s.insert(s.end(), c);
}
else
{
if (inde % 2 == 0)
s.insert(s.end(), c);
else
s.insert(s.begin(), c);
}
}
}
if(inde%2==1)
reverse(s.begin(),s.end());
cout<<s<<endl;
}
B. Count Subrectangles
思路
大佬: 博客.
AC
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define pb push_back
#define mp make_pair
#define ld long double
const int N = 4e4 + 7;
#define INF ~0ULL
int arr[N], brr[N], p[N]; //3因子
int main()
{
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
cin >> arr[i];
for (int i = 1; i <= m; i++)
cin >> brr[i];
int c = 0;
for (int i = 1; i * i <= k; i++)
{
if (k % i == 0)
{
p[c++] = i;
if (i * i == k)
continue;
p[c++] = k / i;
}
}
ll ans = 0;
for (int i = 0; i < c; i++)
{ //枚举因子
ll cnt = 0; //充能
ll x = 0, y = 0;
for (int j = 1; j <= n; j++)
{
if (arr[j] == 1)
cnt++;
else
cnt = 0;
if (cnt == p[i])
{
x++;
cnt--; //前景进一步
}
}
cnt = 0;
for (int j = 1; j <= m; j++)
{
if (brr[j] == 1)
cnt++;
else
cnt = 0;
if (cnt == k / p[i])
{
y++;
cnt--;
}
}
ans += x * y;
}
cout << ans << endl;
return 0;
}
C. Palindromifier
思路
看到这俩,就知道模拟的此时不会超过三次 2^3=8<10
最初的想法就是两端的字符无法通过操作得到
实际就是构造回文串(每一个的)
所以我们可以自己自我构造,构造要步子扯的小,否则并不能保
证添加的字符和原来字符串相处的容掐,会不会造成新的不对称
我们可以将R操作的最短一个贴到string末尾,这样原字符
串的最后一个也能找到对称位置的字符
我们用abca举例子
第一步R(len-1) --> abcac
这样原字符串abca中末尾的a就变到可操作字符范围内了
第二部将可操作区域的所有字符对称到左边
L(len) len为原来string.length();
---> acbabcac
由于对称得到,和第一部分一样
L(2)
其实(所有的操作都是为了将中间的可操作性域复制一部分到头或者尾部
AC
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define pii pair<int,int>
#define psi pair<string,int>
#define ull unsigned ll
#define pb push_back
#define mp make_pair
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
int main()
{
string s;
cin>>s;
int len=s.size();
cout<<3<<endl;
cout<<"R "<<len-1<<endl;
cout<<"L "<<len<<endl;
cout<<"L "<<2<<endl;
}
Gym - 101982C
题意
给n个数。求选m个不同的数有多少种方法
思路
dp[i]=(dp[i]+dp[i-1]*mp[vc[i]])%mod;
AC
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 998244353;
vector<int> vc;
ll dp[1007];
map<int, int> mp;
int main()
{
int n, k;
cin >> n >> k;
int now;
for (int i = 1; i <= n; i++)
{
cin >> now;
if (!mp[now])
vc.push_back(now);
mp[now]++;
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
int len = vc.size();
for (int i = 0; i < len; i++)
for (int j = k; j >= 1; j--)
dp[j] = (dp[j] + dp[j - 1] * mp[vc[i]]) % mod;
cout << dp[k] << endl;
return 0;
}