2018.12.15【NOIP提高組】模擬B組 JZOJ 100046 收集卡片
阿新 • • 發佈:2018-12-15
題目
思路
維護一個區間,列舉結束訂閱的時間判斷能否晚點訂閱,開一個變數模擬指標維護即可。
——鳴謝
大佬考場救急
時間複雜度:
程式碼
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int n,tong[53],ans=0x3f3f3f3f,num,i=1,now=0;
char s[500001];
signed main()
{
scanf("%d\n",&n);
scanf("%s",s+1);
for(register int i=1;i<=n;i++)
{
if(s[i]>96) s[i]-=5;
tong[s[i]-65]=true;//因為大小寫
}
for(register int i=0;i<53;i++) if(tong[i]) num++;
memset(tong,0,sizeof(tong));
for(register int j=1;j<=n;j++)
{
tong[s[j]-65]++;
while( tong[s[i]-65]>1)//判斷頭指標能否往前移
{
tong[s[i]-65]--;
i++;
}
now=0;
for(register int k=0;k<53;k++) if(tong[k]) now++;//判斷是否合法
if(now==num) ans=min(ans,j-i+1);
}
printf("%d",ans);
}