移位包含
题目链接:ybt高效进阶2-1-2
题目大意
判断两个字符串中,是否有一个字符串是另一字符串通过若干次循环移位产生的新串的子串。
思路
因为长度非常的小( ≤ 30 \leq30 ≤30),所以我直接什么都不优化,就直接两重循环枚举两个字符串分别被弄成什么样。然后再 n 2 n^2 n2 判断短的那个是否是长的那个的字符串。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[101], b[101], tmp[101];
bool same;
int as, bs;
bool ch() {//判断是否是子串可以用KMP,但是这里数据规模很小,就懒得打了
for (int i = bs; i <= as; i++) {
memcpy(tmp, a + (i - bs), bs);
same = 1;
for (int i = 0; i < bs; i++)
if (tmp[i] != b[i]) {
same = 0;
break;
}
if (same) return 1;
}
return 0;
}
int main() {
cin >> a >> b;
as = strlen(a);
bs = strlen(b);
if (as < bs) {
swap(a, b);
swap(as, bs);
}
for (int i = 1; i <= bs; i++) {
memcpy(tmp, b + 0, bs - 1);//位移小的字符串
b[0] = b[bs - 1];
for (int i = 1; i <= bs - 1; i++)
b[i] = tmp[i - 1];
for (int j = 1; j <= as; j++) {
memcpy(tmp, a + 0, as - 1);//位移大的字符串
a[0] = a[as - 1];
for (int i = 1; i <= as - 1; i++)
a[i] = tmp[i - 1];
if (ch()) {
printf("true");
return 0;
}
}
}
printf("false");
return 0;
}