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; }