2011-06-28 14:53:55Morris

d017. AB Circle

內容 :

這裡有一個圓,它是由 A 和 B 所組成,我們給它一個名字叫做AB Circle,你可以看到圖中從圓中找出兩個端點切開,我們可以得到兩個字串,仔細觀察,聰明的你應該發現了,其中一個字串中 A 的數量等於另一個字串中 B 的數量。

找出一個這樣的切法很簡單,可是每個圓的切法可能不只一種,而你現在的工作就是要找出一個圓中所有的切法。

輸入說明 :

1.每一筆的輸入長度介於2到1000以內
2.輸入只會有'a'和'b'兩個字元
3.每個字串內都會包含'a'
4.每個字串內都會包含'b'

 

輸出說明 :

1.在輸出答案前,請先輸出"AB Circle #n:",其中 n 代表第n筆
2.輸入可能會超過200筆測試資料,對於每一筆案例,請輸出符合條件的各種切法的兩個端點,中間以 ',' 分開
3.所有輸出的答案,必需經過排序,請參考範例輸出
4.對於長度n的輸入,輸出的端點介於0到n-1之間
5.對於每一筆案例所得到的輸出間,請空一行,可參考範例輸出

 

範例輸入 :

ab
baa

範例輸出 :

AB Circle #1:
0,1

AB Circle #2:
0,1
0,2
1,2

提示 :

背景知識: DP

為了讓你更清楚題意,解釋第二筆案例的輸出 輸入 : baa 從 0,1 切開 : 得到了 b 和 aa 兩個字串 "b"字串中'a'的數量剛好等於"aa"字串中'b'的數量,也就是 0 從 0,2 切開 : 得到了 ba 和 a 兩個字串 "ba"字串中'b'的數量剛好等於"a"字串中'a'的數量,也就是 1 從 1,2 切開 : 得到了 a 和 ab 兩個字串 "a"字串中'a'的數量剛好等於"ab"字串中'b'的數量,也就是 1 請注意 : 輸出的結果可能會很龐大.

出處 :

ZHENG, Jianqiang (管理:chest)



舊版 : 在 "摸索C語言"
以下是新版

只要知道A的個數,以及B的個數即可
假設起始點是i,那麼它CUT的就是i+min(CA,CB)  or i+max(CA,CB)
i~j有x個A以及j-i+1-x個B,以外則有CA-x個A以及CB-j+i-1+x個B
1. x=CB-j+i-1+x => j=CB+i-1;
2. j-i+1-x=CA-x =>  j=CA+i-1;
決定小或大的先後吧


/**********************************************************************************/
/*  Problem: d017 "AB Circle" from ZHENG, Jianqiang                               */
/*  Language: C                                                                   */
/*  Result: AC (42ms, 252KB) on ZeroJudge                                         */
/*  Author: morris1028 at 2010-11-08 16:08:24                                     */
/**********************************************************************************/


#include<stdio.h>
#include<stdlib.h>
int Max(int x, int y)   
{
    if(x>y)    return x;
    else return y;
}   
int Min(int x, int y)   
{
    if(x<y)return x;
    else return y;
}  
main()
{
    char S[1001], t=0;
    while(scanf("%s",&S)==1)
        {
            printf("AB Circle #%d:\n",++t);
            int CA=0, CB=0, a, L;
            for(a=0;S[a];a++)
                if(S[a]=='a')    CA++;
                else    CB++;
            for(L=a, a=0;a+Min(CA,CB)<L;a++)
                {
                    if(CA!=CB)
                        {
                            printf("%d,%d\n",a,a+Min(CA,CB));
                            if(a+Max(CA,CB)<L)
                                printf("%d,%d\n",a,a+Max(CA,CB));
                        }
                    else printf("%d,%d\n",a,a+CA);
                }
        }
    return 0;
}