YBTOJ 2.1字符串处理
A.数字反转
记得特判第一位是负号的情况 然后倒着输出就行了
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 0721;
char s[N];
int main() {
char c;
scanf("%c",&c);
if (c == '-') {
scanf("%s",s);
printf("-");
int len = strlen(s);
bool flag = 1;
for (int i = len - 1; i >= 0; --i) {
if (flag && s[i] == '0' && i != 0)
continue;
flag = 0;
printf("%c",s[i]);
}
}
else {
s[0] = c;
scanf("%s",s + 1);
int len = strlen(s);
bool flag = 1;
for (int i = len - 1; i >= 0; --i) {
if (flag && s[i] == '0' && i != 0)
continue;
flag = 0;
printf("%c",s[i]);
}
}
return 0;
}
B.移位包含
直接使用使用 \(STL\) 暴力草过()
如果不用 \(STL\) 用 \(KMP\) 或者暴力匹配也可以 反正数据范围不大
点击查看代码
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
const int N = 31;
char s1[N], s2[N], s1_[N];
int main() {
cin >> s1 >> s2;
int len = strlen(s1);
int len_ = strlen(s2);
memcpy(s1_, s1, sizeof(s1));
if (strstr(s1, s2)) {
printf("true");
return 0;
}
for (int i = 1; i <= len; i++) {
s1[len] = s1[0];
for (int j = 0; j < len; j++) s1[j] = s1[j + 1];
s1[len] = '\0';
if (strstr(s1, s2)) {
printf("true");
return 0;
}
}
if (strstr(s2, s1_)) {
printf("true");
return 0;
}
for (int i = 1; i <= len_; i++) {
s2[len_] = s2[0];
for (int j = 0; j < len_; j++) s2[j] = s2[j + 1];
s2[len_] = '\0';
if (strstr(s2, s1_)) {
printf("true");
return 0;
}
}
printf("false");
return 0;
}
C.单词替换
使用 \(cin\) 和 \(scanf\) 的各种玄学字符串输入 直接过去了(
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 521;
string s[N], bth, th;
int cnt;
int main() {
while (1) {
++cnt;
cin >> s[cnt];
char c;
scanf("%c", &c);
if (c != ' ') break;
}
cin >> bth;
cin >> th;
for (int i = 1; i <= cnt; ++i) {
if (s[i] == bth) cout << th;
else cout << s[i];
cout << ' ';
}
return 0;
}
D.字符串环
非常谔谔的一道题
我们将每个字符串复制一份接在后面模拟环
然后暴力匹配
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main() {
string a, b;
int ans = 0, tmp = 0, x;
cin >> a >> b;
int lena = a.length();
int lenb = b.length();
a += a;
b += b;
x = min(lena, lenb);
ans = 0;
for (int i = 0; i < lena; i++) {
for (int j = 0; j < lenb; j++) {
while (a[i + tmp] == b[j + tmp] && tmp < x) tmp++;
ans = max(ans, tmp);
tmp = 0;
}
}
printf("%d\n", ans);
return 0;
}
E.生日相同
使用 \(string\) 自带的比较大小就能过
但是注意 \(string\) 在比较两个长度不同的字符串的时候似乎会出锅 所以建议手动特判下
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 0721;
struct node {
int m, d;
string name;
friend bool operator<(node x, node y) {
if (x.m != y.m) return x.m < y.m;
else if (x.d != y.d) return x.d < y.d;
else if (x.name.size() != y.name.size()) return x.name.size() < y.name.size();
else return x.name < y.name;
}
} a[N];
int n;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
cin >> a[i].name;
scanf("%d%d", &a[i].m, &a[i].d);
}
sort(a + 1, a + 1 + n);
int lm = a[1].m, ld = a[1].d;
printf("%d %d ", lm, ld);
cout << a[1].name << " ";
for (int i = 2; i <= n; ++i) {
if (a[i].m == lm && a[i].d == ld) cout << a[i].name << " ";
else {
printf("\n");
lm = a[i].m, ld = a[i].d;
printf("%d %d ", lm, ld);
cout << a[i].name << " ";
}
}
return 0;
}