给出两个字符串A和B,问A的排列在B中出现了多少次。
因为任意排列都符合要求,所以我们只需记录每种数字在子串出现的次数。
先记录出每个值出现了几次,作为需求数。
然后找出B中所有值。
挨个入队,需求值-1,如果一个需求值<0,证明多入队了,从前面开始出队直到需求值为0,如果队内数等于出现次数,ans+1;
//写的很含糊,看代码吧
#include <iostream>
#include <cstring>
#include <queue>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <map>
#define maxn 3000000
#define inf 1<<30
using namespace std;
char s[maxn];
char str[maxn];
int visit[8000000];//记录每个单词出现了几次
int a[555555];//每个词组的ASC值
int main()
{
gets(s);
gets(str);
int len=strlen(s);
int cnt=0;
memset(visit,0,sizeof(visit));
for(int i=0;i<len;i+=4)
{
int t;
t=(s[i]-33)*100+(s[i+1]-33)*10+(s[i+2]-33);
visit[t]++;
cnt++;
}
len=strlen(str);
int n=0;
for(int i=0;i<len;i+=4)
{
int t;
t=(str[i]-33)*100+(str[i+1]-33)*10+(str[i+2]-33);
a[n++]=t;
}
int p=0;
int ans=0;
//cout<<cnt<<" "<<n<<endl;
if(n<cnt)
{
cout<<"0"<<endl;
}
else
{
for(int i=0;i<n;i++)//入队
{
visit[a[i]]--;//该值的需求值-1
if(visit[a[i]]<0)//说明这个值多入队了,前面的出队
{
while(visit[a[i]]<0)//直到这个值还需求数 为0
{
visit[a[p]]++;//出队,需求数+1
p++;//出队的数的个数
}
}
if(i-p+1==cnt)//i-p+1=队内数,刚好匹配
{
ans++;//结果+1
visit[a[p]]++;//出队
p++;//出队个数
}
//cout<<p<<endl;
}
cout<<ans<<endl;
}
return 0;
}