【題解】abc

題目來源:牛客競賽
在這裏插入圖片描述

思路:

題目的意思是求字符串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’了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章