女神はあなたに文字列を教えます——ACはただ1つの梦想ではありません

5934 ワード

D-女神が文字列を教える-ACは夢だけではないTime Limit:2000/1000 MS(Java/others)Memory Limit:128000/64000 KB(Java/others)Submit Status Problem Description
AC is not a dream.--女神はみんなが多くのACを望んで、みんながACの中で自信を見つけることができることを望んでいます.そこで女神はあなたに聞いて、一言の中にACdreamがいくつありますか?大文字と小文字を区別する必要はありません.スペースを無視して、車に戻ります.一言とは句点(.)、疑問符(?)、感嘆符(!)で終わる一連の可視文字(ASCII 32(スペース)~126('~'波線))構成された文字列.具体的なASCIIコードテーブルは、私のInputをスタンプしてください.
複数行の文字列で構成され、各文はデータのセットであり、1文の定義は問題面のようなものである.総文字数は100000文字を超えない.Output
データのセットごとに整数を出力します.Sample Input
AC is not a dream. But ACdream is a dream world where every body can have an AC dream. AC?AC! Sample Output
0 2 0 0 Hint
気をつけてください
題目大意:文字列にマッチする、「ACdream」.大文字と小文字を区別せず、スペースを無視して、車に戻る.分析:大体三つのピットがある.一、大文字と小文字を統一する.二、行末の車をどのように処理して、複数行の文字列を一つの行にまとめるか.三、一つの行には一つ以上の文があるかもしれない.
コード:
#include <iostream>
#include <cstdio>
#include <cctype>
#include <string>
#include <cstring>
using namespace std;

const int maxn = 100010;

int n, m, kase;
int a[maxn], c[maxn];
char s[maxn], q[maxn] = "";
char t[10] = "acdream";

int main() {
    int ff = 0, tt = 0;
    while(cin >> s) {
        if(ff == 0) strcpy(q, s);
        if(ff == 1) strcat(q, s);
        int len = strlen(s);
        if(s[len-1] != '?' && s[len-1] != '.' && s[len-1] != '!') { ff = 1; continue; }   //   ,  
        strcpy(s, q);
        int cnt1 = 1;
        len = strlen(s);
        memset(c, 0, sizeof(c));
        for(int i = 0; i < len; i++) {
            if(s[i] == '?' || s[i] == '.' || s[i] == '!')           //   ,  
                c[cnt1++] = i;
            if(isupper(s[i])) s[i] += 32;                           //   ,   
        }
        for(int ll = 1; ll < cnt1; ll++) {
            int cnt2 = 0, ans = 0;
            memset(a, 0, sizeof(a));
            for(int i = c[ll-1]; i < c[ll]; i++)
                if(s[i] == 'a') a[cnt2++] = i;
            for(int i = 0; i < cnt2; i++) {
                int flag = 0;
                for(int j = a[i], k = 0; k < 7; j++, k++) {
                    if(s[j] == ' ') j++;
                    else if(s[j] != t[k]) {
                        flag = 1;
                        break;
                    }
                }
                if(!flag) ans++;
            }
            printf("%d
"
, ans); } memset(q, 0, sizeof(q)); tt = 0; ff = 0; } return 0; }