題目來源:牛客競賽
思路:
題目的意思是求字符串s中有多少個子串(不一定要連續)爲’abc’
一開始想到先找到a的位置,再找到a後面b的位置,然後ans加上b的後面有多少個c,可是這樣的話每查找一次a的時間是n,查找a後面b的位置的時間是n,總的時間複雜度就是n方,會超時,有沒有什麼更好的方法呢?
不如稍微改變一下思路,先找到b的位置,再看看b的前面有多少個a,b的後面有多少個c,二者相乘就是包含這個b的子串’abc’的數量,用ans累加起來就行了
至於b的前面有多少個a,後面有多少個c,可以預處理
code:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long anss;
int a[N],c[N],n;
/*a[i]:i位置前面有多少個a
c[i]:i位置後面有多少個c
*/
char s[N],C;
//s[]:字符串
int main()
{
while ((C=getchar())!='\n') s[n++]=C;n--;
for (int i=0,j=n;i<n,j>=0;i++,j--) //預處理
{
a[i]=a[i-1]+(s[i]=='a');
c[j]=c[j+1]+(s[j]=='c');
}
for (int i=0;i<n;i++)
if (s[i]=='b') anss+=a[i]*c[i];//累加答案
printf("%lld\n",anss);
return 0;
}
其實這個代碼還可以優化,預處理出每個b的位置,這樣就不用for循環一遍找’b’了