3 abc 1 abcabc 1 abcabc 2
6 15 21
官方題解:
枚舉字符串下標i,每次計算以i為結尾的符合條件的最長串。那麼以i為結尾的符合條件子串個數就是最長串的長度。求和即可。
計算以i為結尾的符合條件的最長串兩種方法:
1.維護一個起點下標startPos,初始為1。如果當前為i,那麼cnt[str[i]]++,如果大於k的話,就while( str[startPos] != str[i+1] ) cnt[str[startPos]]--, startPos++; 每次都保證 startPos~i區間每個字母個數都不超過k個。ans += ( i-startPos+1 )。 時間復雜度O(n)
2.預處理出所有字母的前綴和。然後通過二分找出以i為結尾的符合條件的最長串的左邊界。時間復雜度O(nlogn),寫的不夠好的可能超時。
代碼:
#include#include #include #include using namespace std; int a[30]; char s[101000]; int main() { int t,k,n; scanf("%d",&t); while(t--) { memset(s,0,sizeof(s)); memset(a,0,sizeof(a)); scanf("%s",s); n=strlen(s); scanf("%d",&k); long long ans=0; int start=0; for(int i=0;i k) { while(s[start]!=s[i]) { a[s[start]-'a']--; start++; } a[s[start]-'a']--; start++; } ans+=(i-start+1); } printf("%I64d\n",ans); } return 0; }