洛谷p1038-统计单词数

题目链接

思路一:

首先,最直接的思路是分别用两个数组取存储输入的数。
因为题目要求是不需要区分大小写的,所以最好先将这些字母的大小写统一一下。
最关键的是其中的for循环的理解,if(b[i]==’ ‘)这句话是先让i走到b数组的一个完整单词的后面,
限定j一次循环的位置。
k=0,k要每次都等于0,因为每一个新的循环,对于j来说是从n开始,对于k来说总是从数组k的第一个位置开始。
n就是配合着j,确定每一次循环,j开始的位置,都是从n开始。

注意:下面代码总是有三个测试点不通过,用O2优化就能通过…看了半天也没看出来哪里没思考到位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<stdio.h>
#include<string.h>
int main(){
char a[11],b[1000001];
gets(a);
gets(b);
strcat(a," ");//为每个数组的最后面添加上空格,这样更方便后面的操作
strcat(b," ");
for(int i=0;a[i]!='\0';i++){//全都变为大写,方便比较
if(a[i]>='a'){//变为大写
a[i]-='a'-'A';
}
}
for(int i=0;b[i]!='\0';i++){
if(b[i]>='a'){//变为大写
b[i]-='a'-'A';
}
}

int s;
int i;
int n=0;//n是用来配合j,循环数组b用的,即下面的for循环中的j=n,
int j,k;//分别用来遍历两个数组用
int rec;//记录第一次匹配字符串的位置(和n配合使用)
int geshu=0;//统计b数组中有多少个和a匹配

for(i=0;b[i]!='\0';i++){
if(b[i]==' '){//这是为了要让数组b的j先跑到一个空格处停下来,
//以次作为下面的一次循环,j的停止的位置,即下面的for循环中,j<=i的原因
s=1;//用来表示各个位能够对应相等,
//如果最后s是1,说明全都对应相等,
//如果有一位不等,s就会为0,即不全部对应相等
for(j=n,k=0;j<=i,a[k]!='\0';j++,k++){
if(a[k]==b[j]){
s*=1;//用一直乘的方法
}else{
s*=0;
}
}
if(s==1){
geshu++;//这个是相对应的次数
}
if(s==1&&geshu==1){
rec=n;//这是用来记录第一次符合的位数
}
n=i;//n直接变为i,
n++;//因为现在所指处为空格,所以要加一,跳过这个空格

}
}
if(geshu==0){
geshu=-1;
printf("%d",geshu);
}else if(geshu>=1){
printf("%d %d",geshu,rec);
}
return 0;
}