Think:
1知识点:桶记录数组动态滚动
2题意:输入字符串1和字符串2,询问字符串1是否可能由字符串2经过3种操作得到,a操作:交换任意两个字符(可交换大于等于0次);b操作:输出字符串2时在其之前提前输出一个字符串;c操作:输出字符串2之后再输出一个字符串
3错误反思:注意控制长度
4方法:桶记录数组动态滚动
以下为Accepted代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char st1[101400], st2[101400];
int a[40], b[40];
int main(){
int T, i, j, flag;
scanf("%d", &T);
while(T--){
flag = 0;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
scanf("%s %s", st1, st2);
int len1 = strlen(st1);
int len2 = strlen(st2);
for(i = 0; i < len2-1; i++){
a[st1[i]-'a']++, b[st2[i]-'a']++;
}
b[st2[len2-1]-'a']++;
for(i = len2-1; i < len1; i++){
a[st1[i]-'a']++;/*向下滚动*/
for(j = 0; j < 26; j++){
if(a[j] != b[j]){
break;
}
}
if(j == 26){
flag = 1;
break;
}
a[st1[i-(len2-1)]-'a']--;/*状态更新*/
}
printf("%s\n", flag == 1? "YES": "NO");
}
return 0;
}