你有一个播放器可以随机播放歌曲。你现在有一部分的播放记录,问下一次随机播放有多少种可能性。
利用滑动窗口,出现重复的歌曲说明不是一个序列。
推荐博文https://blog.youkuaiyun.com/hyqsblog/article/details/47000833,把lls的注释都翻译成了中文,通俗易懂
AC代码:
#include <iostream>
using namespace std;
const int maxn=100010;
int s,n,x[maxn*3],cnt[maxn],ok[maxn*2];
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>s>>n;
fill(x,x+n+2*s,-1);
for(int i=0;i<n;i++)
cin>>x[i+s];
int tot=0;
fill(cnt+1,cnt+s+1,0);
fill(ok,ok+s+n+1,0);
for(int i=0;i<n+s+1;i++)
{
if(tot==s) ok[i]=1;
if(i<s&&tot==i) ok[i]=1;
if(i>n&&tot==n+s-i) ok[i]=1;
if(i==n+s) break;
if(x[i]!=-1&&--cnt[x[i]]==0) tot--;
if(x[i+s]!=-1&&cnt[x[i+s]]++==0) tot++;
}
int ans=0;
for(int i=0;i<s;i++)
{
int vaild=1;
for(int j=i;j<n+s+1;j+=s)
if(!ok[j]) vaild=0;
if(vaild) ans++;
}
if(ans==n+1) ans=s;
cout<<ans<<endl;
}
return 0;
}