2011-09-01 08:46:05Morris

c106. Simply Syntax

c106. Simply Syntax

內容 :

在 Hedonia 島上的官方語言是 Hedonian 語。有位 Hedonian 語言學教授發現她的許多學生並未弄明白 Hedonian 語的語法規則。她實在是厭煩了訂正學生的語法錯誤,所以她決定要她的學生們寫個程式,能夠檢查出他們寫的句子中的語法錯誤。就跟 Hedonian 人的天性一樣,Hedonian 語的文法規則也相當單純,規則如下:

0.
這個語言中僅有 p 到 z,還有 N,C,D,E,I 這幾個字母。
1.
從 p 到 z 中,任何一個字母都是一個正確的句子。
2.
如果 s 是一個正確的句子,那麼 Ns 也是。
3.
如果 st 都是正確的句子,那麼 Cst, Dst, Est 還有 Ist 也都是正確的句子。
4.
0. 到 3. 是檢查一個句子是否合乎語法僅有的規則。

你被要求寫程式檢查一個句子是否滿足上述的規則 0. 到 4.。

輸入說明 :

輸入中含有許多句子,每個句子一列,都只含有 p 到 z 還有 N, C, D, E, I這幾個字母。你可以假設每個句子至多有 256 個字母,至少 1 個字母。

輸出說明 :

對於一個格式正確的句子輸出 YES,對於一個錯誤的句子則輸出 NO。

範例輸入 :

CpIszNIszCqpqIzIstIIszzIIszIszIIszIIIszzIszNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCstzNzzIstz

範例輸出 :

NOYESYESNOYESYESYESYESYESNONONOYES

提示 :

* Luck 貓翻譯

出處 :

ACM 271 (管理:sa072686)



作法 : 模擬

/**********************************************************************************/
/*  Problem: c106 "Simply Syntax" from ACM 271                                    */
/*  Language: C                                                                   */
/*  Result: AC (0ms, 138KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-09-01 08:43:12                                     */
/**********************************************************************************/


#include<stdio.h>
#include<string.h>
int check(char *s) {
    int i, l = strlen(s), accept = 0;
    for(i = l-1; i >= 0; i--) {
        switch(s[i]) {
            case 'p' ... 'z':accept ++;break;
            case 'N':if(accept == 0)
                        return 0;
                break;
            case 'C':if(accept < 2)
                        return 0;
                accept--;
                break;
            case 'D':if(accept < 2)
                        return 0;
                accept--;
                break;
            case 'E':if(accept < 2)
                        return 0;
                accept--;
                break;
            case 'I':if(accept < 2)
                        return 0;
                accept--;
                break;
            default:return 0;
        }
    }
    return (accept == 1);
}
main() {
    char s[1000];
    while(gets(s)) {
        puts(check(s) ? "YES" : "NO");
    }
    return 0;