PAT1093A

題目

1093 Count PAT's (25分)
The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th characters.

Now given any string, you are supposed to tell the number of PAT's contained in the string.

Input Specification:
Each input file contains one test case. For each case, there is only one line giving a string of no more than 10^5 characters containing only P, A, or T.

Output Specification:
For each test case, print in one line the number of PAT's contained in the string. Since the result may be a huge number, you only have to output the result moded by 1000000007.

Sample Input:
APPAPT
Sample Output:
2


題目描述

這道題目描述的是稻扬,給予一個(gè)僅包含‘P’卸例、‘A’和‘T’三個(gè)字母的字符串,然后統(tǒng)計(jì)其中可以組成“PAT”串的子串的個(gè)數(shù)原茅。例如,題目例子:“APPAPT”裁着,有兩個(gè)可以組成“PAT”的子串持钉。(分別是第2,4第练,6個(gè)字符和第3阔馋,4,6個(gè)字符)

題目分析

??這道題目換個(gè)角度想就是一道排列組合的題目娇掏,假設(shè)字符串str[i]=='A'(第i位為“A”)呕寝,以第i位的A來組成的字符串“PAT”個(gè)數(shù) = 這個(gè)“A”的前面字符“P”的數(shù)量 * 這個(gè)“A”的前面字符“T”的數(shù)量。這道題則只需統(tǒng)計(jì)所有字符“A”前面的字符“P”與后面“T”字符的數(shù)量婴梧,然后相乘累加即可下梢。
??如果以常規(guī)方法,枚舉字符串里每個(gè)字符“A”塞蹭,然后再分別從頭以及從尾計(jì)算其“P”和“T”字符的個(gè)數(shù)孽江,其計(jì)算復(fù)雜度會(huì)達(dá)到O(n^2),算法會(huì)超時(shí)番电。因此岗屏,需要利用字符串里的一些遞推關(guān)系,假設(shè)numP[i]為第i個(gè)字符前“P”字符的個(gè)數(shù)(包含本身),則:
numP[i]=\begin{cases}numP[i - 1]+1 &str[i] =P \cr numP[i - 1], &str[i] \neq P\end{cases}
因?yàn)閚umP[i-1]已經(jīng)包含了從字符串0~i-1位字符串“P”的數(shù)量这刷,只需要再看看當(dāng)前的字符是否為P即可婉烟。同理也只需以類似方法記錄字符后面“T”的數(shù)量;然后再從頭開始枚舉崭歧,遇到字符“A”再將其numP與numT相乘累加即可隅很。

#include<stdio.h>
#include<string.h>

char str[100010];
int numP[100010];

int main() {
    int length, rightNumT;
    long long result;
    
    scanf("%s", str);
    length = strlen(str);
    
    result = 0;
    memset(numP, 0, sizeof(numP));
    for (int i = 0; i < length; i++) {
        if (i != 0)
          numP[i] = numP[i - 1];
        if (str[i] == 'P')
          numP[i]++;
    }
    
    rightNumT = 0;
    for (int i = length - 1; i >= 0; i--) {
        if (str[i] == 'T')
          rightNumT++;
        else if ( str[i] == 'A' )
          result = (result + numP[i] * rightNumT) % 1000000007;
    }

    printf("%d\n", result);
    
    return 0;
}

總結(jié)

???這道題因?yàn)槊總€(gè)“PAT”的組成需要字符‘A’,因此以字符‘A’作為中心率碾,計(jì)算前面‘P’和后面‘T’的個(gè)數(shù)相乘叔营;換個(gè)其他字符,例如我設(shè)置一個(gè)數(shù)組計(jì)算從該字符往后字符“A”與字符“T”的個(gè)數(shù)所宰,然后掃描數(shù)組绒尊,當(dāng)遇到字符“P”時(shí),result += 后面字符“A”的個(gè)數(shù) * 后面字符“T”的個(gè)數(shù)仔粥,這樣也是可行的婴谱。
???該道題目是如何利用遞推關(guān)系,來快速統(tǒng)計(jì)相應(yīng)字符的個(gè)數(shù)躯泰。這里是設(shè)置一個(gè)數(shù)組來記錄從頭至當(dāng)前位置谭羔,某字符的個(gè)數(shù),那么當(dāng)前位置i的個(gè)數(shù)就只需前一個(gè)i-1位置的個(gè)數(shù)(已經(jīng)有了從頭至i-1位的個(gè)數(shù))麦向,再判斷當(dāng)前第i位是否也是該字符瘟裸,即可統(tǒng)計(jì)到從頭至今位置某特定字符的個(gè)數(shù)。
???在做該道題目的時(shí)候诵竭,一開始曾使用過利用兩個(gè)數(shù)組分別記錄前面“P”與后面“T”的個(gè)數(shù)话告,可是僅通過了部分測(cè)試點(diǎn);也在網(wǎng)絡(luò)上看到也是通過兩個(gè)數(shù)組來解題卵慰,可以通過全部測(cè)試點(diǎn)沙郭。(還沒想到出錯(cuò)的原因)網(wǎng)絡(luò)上柳神有無需使用數(shù)組也可通過的版本,也還沒認(rèn)真了解過其過程裳朋。我最后是依據(jù)書本方法來通過該道題病线。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鲤嫡,隨后出現(xiàn)的幾起案子氧苍,更是在濱河造成了極大的恐慌,老刑警劉巖泛范,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件让虐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罢荡,警方通過查閱死者的電腦和手機(jī)赡突,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門对扶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惭缰,你說我怎么就攤上這事浪南。” “怎么了漱受?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵络凿,是天一觀的道長。 經(jīng)常有香客問我昂羡,道長絮记,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任虐先,我火速辦了婚禮怨愤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛹批。我一直安慰自己撰洗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布腐芍。 她就那樣靜靜地躺著差导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猪勇。 梳的紋絲不亂的頭發(fā)上柿汛,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音埠对,去河邊找鬼。 笑死裁替,一個(gè)胖子當(dāng)著我的面吹牛项玛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弱判,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼襟沮,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了昌腰?” 一聲冷哼從身側(cè)響起开伏,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遭商,沒想到半個(gè)月后固灵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劫流,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年巫玻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丛忆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仍秤,死狀恐怖熄诡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诗力,我是刑警寧澤凰浮,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站苇本,受9級(jí)特大地震影響袜茧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圈澈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一惫周、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧康栈,春花似錦递递、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悬荣,卻和暖如春菠秒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氯迂。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工践叠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嚼蚀。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓禁灼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轿曙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弄捕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355