I. 试题I:调皮的JM 25’
描述
在竞码小学,JM同学是捣蛋三巨头之一,调皮的很。有一次,在课外活动的时候,JM同学偷偷跑到老师办公室玩耍,一不小心把英语老师电脑上准备上课用的英文文章给删掉了,导致英语老师暴跳如雷,生气的很。老师给了JM一个改过自新的机会,如果JM能够找出删除的文章H中出现了多少个子串与字符串S等价,那么老师将原谅JM同学,否则,请家长是免不了的~对于两个字符串等价,我们的定义为:两个字符串按照字典序排序后相同,则认为是等价字符串。
例如:aabaab 和 baabaa 两个字符串为等价字符串
abaaba 和 bbabba 则不是等价字符串。
输入
第一行输入一个字符串SS、
第二行输入一个字符串HH

输出
输出子串个数

样例
输入
aab
abacabaa
输出
3
题解:前缀和统计就可以了统计区间为字符串s的长度是不是满足里面的字母次数与s一样

#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<set>
#include<vector>
#include<map>
#include<queue>
#define ll long long
using namespace std;
int ans;
int cnt[26],st[26];
string s,p;
bool check(){
    for(int i=0;i<26;i++){
        if(st[i]!=cnt[i]) return false;
    }
    return true;
}
int main(){
    cin>>s>>p;
    int m=s.length();
    int n=p.length();
    for(int i=0;i<m;i++){
        cnt[s[i]-'a']++;
    }

    for(int i=0,j=0;j<n;j++)
    {
          st[p[j]-'a']++;
          if(j-i+1>m)
          {
              st[p[i]-'a']--;//记得--
              i++;
          }
          if(check())ans++;
    }
    cout<<ans<<endl;
    return 0;
}