B-正则表达式_河南萌新联赛2024第(三)场:河南大学(重现赛) (nowcoder.com)
直接对四个数字判断是否在[0,255]内即可
void solve()
{
ll n;
cin >> n;
ll ans = 0;
for (int i = 1; i <= n; i++)
{
ll a, b, c, d;
char s, ss, sss;
cin >> a >> s >> b >> ss >> c >> sss >> d;
if (a >= 0 && a <= 255 && b >= 0 && b <= 255 && c >= 0 && c <= 255 && d >= 0 && d <= 255)
{
ans++;
}
}
cout << ans << "\n";
return;
}
C-Circle_河南萌新联赛2024第(三)场:河南大学(重现赛) (nowcoder.com)
有规律n*n-n+2
const int N = 2e6 + 10;
ll a[N];
void solve()
{
ll t;
cin >> t;
for (int i = 1; i <= t; i++)
{
ll n;
cin >> n;
if(n==0)
a[i]=1;
else
a[i] = n*n-n+2;
}
for (int i = 1; i <= t; i++)
{
cout << a[i] << " ";
}
return;
}
F-累加器_河南萌新联赛2024第(三)场:河南大学(重现赛) (nowcoder.com)
这里首先要知道一个定理,i^(i-1)转化为二进制后的异或结果就是两者二进制位数的不同数,我们用一个bitset记录即可,因为要求的是x+y即数据要开到2e6以上,我们用一个数组来来记录每个i位的变化,一直累加下去,最后求解的结果就是ans[x+y]-ans[x]
bitset<32>q;
ll ans[N];
void solve()
{
for (int i = 1; i <= N; i++)
{
q = (i - 1) ^ i;
ans[i] = ans[i - 1] + q.count();
}
int t;
cin >> t;
while (t--)
{
int x, y;
cin >> x >> y;
cout << ans[x + y] - ans[x] << "\n";
}
return;
}
J-keillempkill学姐の卷积_河南萌新联赛2024第(三)场:河南大学(重现赛) (nowcoder.com)
四重循坏即可(数据范围很小,最大也是25^4,完全不用担心)
ll a[25][25];
ll b[25][25];
void solve()
{
ll n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> a[i][j];
}
}
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> b[i][j];
}
}
ll t = m - n + 1;
ll res = 0;
for (int i = 1; i <= t; i++)
{
for (int j = 1; j <= t; j++)
{
res = 0;
for (int k = 1; k <= n; k++)
{
for (int kk = 1; kk <= n; kk++)
{
res += a[k][kk] * b[i + k - 1][j + kk - 1];
}
}
cout << res << " ";
}
cout << "\n";
}
return;
}
L-SSH_河南萌新联赛2024第(三)场:河南大学(重现赛) (nowcoder.com)
感觉这道题目对于练习stl很有效果,能熟练使用vector的话这道题就很容易写出来,这里我们需要两个vector,一个是记录端口下的用户名,另一个是用来记录用户所拥有的私钥,再用一个map把私钥和公钥进行绑定,根据题目要求进行遍历就行
void solve()
{
ll m, n, q;
cin >> m >> n >> q;
map<string, string>mp1;
map<string, vector<string>>mp2;
map<string, vector<string>>mp3;
for (int i = 0; i < m; i++)
{
string a, b;
cin >> a;
cin >> b;
mp1[b] = a;
}
for (int i = 0; i < n; i++)
{
string a;
int k;
cin >> a;
cin >> k;
for (int j = 0; j < k; j++)
{
string b;
cin >> b;
mp2[a].push_back(b);
int t;
cin >> t;
for (int s = 0; s < t; s++)
{
string key;
cin >> key;
mp3[b].push_back(key);
}
}
}
int flag = 0, tt = 0;
for (int i = 0; i < q; i++)
{
flag = 0, tt = 0;
string u, ip, pri;
cin >> u >> ip >> pri;
for (auto x : mp2[ip])
{
if (x == u)
{
flag = 1;
break;
}
}
if (flag == 0)
{
cout << "No\n";
}
else
{
string w = mp1[pri];
for (auto x : mp3[pri])
{
if (x == w)
{
tt = 1;
break;
}
}
if (tt == 0)
{
cout << "No\n";
}
else
{
cout << "Yes\n";
}
}
}
return;
}
还写了一道字符串的题目,感觉还行
P1481 魔族密码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
虽然是字符串的题目我们却可以使用线性dp来完成(仔细观察我们不难发现这其实就是一道稍微变形了的最长上升子序列问题),这里我学了一下char中关于strstr的使用,即strstr(s1,s2)判断s2是不是s1的子串,若是就返回其对应的下标,为了满足题目要求我们可以知道不仅要求是子串,还得是前缀,即我们对strstr(s1,s2)进行判断,若其返回值的首位与s1相同则证明符合题意,否则不行
AC代码:
ll f[N];
void solve()
{
ll n;
cin >> n;
ll ans = 0;
for (int i = 1; i <= n; i++)
{
cin >> s[i];
f[i] = 1;
for (int j = i - 1; j >= 1; j--)
{
if (strstr(s[i], s[j]) == s[i])
{
f[i] = max(f[i], f[j] + 1);
}
}
ans = max(ans, f[i]);
}
cout << ans << "\n";
return;
}