1 条题解
-
0Guest LV 0 MOD
-
0
和上面的一样,满足同构串,一定是 长度必须相等,字母出现的次数一样,也满足 一致性。最后暴力找一遍即可。
cpp
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int M=26, N1=5000005, N2=1005;
int a[M], b[M];
char t[N1], s[N2];
bool chk(int a[], int b[]){
for (int i=0; i<M; i++)
if (a[i]!=b[i]) return false;
return true;
}
int main(){
freopen("same.in", "r", stdin);
freopen("same.out", "w", stdout);
ios::sync_with_stdio(false);
string s, t;
cin>>s>>t;
//scanf("%s", s.c_str());
//scanf("%s", t.c_str());
//scanf("%s", s); //子串
//scanf("%s", t); //父串
//int len=strlen(s); //设子串长度为len
int len=s.size() , len2=t.size() ;
for (int i=0; i<len; i++)
a[s[i]-'a']++; //将子串中每个字符出现的次数用桶记录
for (int i=0; i<len; i++)
b[t[i]-'a']++; //将父串中前len个字符出现的次数用桶记录
int ans=chk(a, b);//, len2=strlen(t); //先比较一次
for (int i=len; i<len2; i++){
b[t[i-len]-'a']--;//把前一个字符减去
b[t[i]-'a']++; //加上下一个字符
ans+=chk(a, b);
}
printf("%d\n", ans);
return 0;
}
- 1