D - 女神教你字符串——AC不只是一个梦想
Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
Submit Status
Problem Description
AC is not a dream. ——女神
女神希望大家多多AC,希望大家能在AC中找到自信。于是女神问你,一句话里面有多少个ACdream?
不需要分大小写,忽略空格,回车。
所谓一句话是指以句号(.),问号(?),感叹号(!)结束的一串由可见字符(ASCII从32(空格)~126(‘~’波浪线))组成的字符串。
具体ASCII码表可查阅:请戳我
Input
由若干行字符串组成,每一句话即为一组数据,一句话的定义如题面。总字符数不超过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\n", ans);
}
memset(q, 0, sizeof(q));
tt = 0;
ff = 0;
}
return 0;
}