1. 程式人生 > >2018.12.15【NOIP提高組】模擬B組 JZOJ 100046 收集卡片

2018.12.15【NOIP提高組】模擬B組 JZOJ 100046 收集卡片

題目

JZOJ 100046 收集卡片


思路

維護一個區間,列舉結束訂閱的時間判斷能否晚點訂閱,開一個變數模擬指標維護即可。
——鳴謝 w y c wyc 大佬考場救急

時間複雜度: O

( n ) O(n)


程式碼

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