https://www.luogu.org/problemnew/show/P1308

简单哈希一下判断,练练手。

注意fgets()的用法,第一个参数传存储位置,第二个参数传内存上限,第三个传stdin。

注意scanf()任何东西(包括%s)都是会把换行符留在输入流中,这时候可以用getchar()跳过它。

sscanf()好像和想象中不太一样?

C语言的字符拥有isupper(),islower(),isalpha(),isdigit(),isalnum()等函数,且可以用toupper(char),tolower(char)来快速转换。

#include<bits/stdc++.h>
using namespace std;
#define ll long long char s[];
char t[];
char tmp[];
int tmptop=;
int s1,t1;
ll hash_s; ll hash_f(char* s,int l){
ll ha=;
for(int i=;i<l;i++){
ha=ha*+s[i];
}
return ha;
} int main(){
scanf("%s",s);
getchar();
fgets(t,,stdin); s1=strlen(s);
for(int i=;i<s1;i++){
if(s[i]>='A'&&s[i]<='Z'){
s[i]=s[i]-'A'+'a';
}
} hash_s=hash_f(s,s1);
//cout<<hash_s<<endl; int ans=;
int first=-;
int be=; int i=;
while(t[i]==' '||isalpha(t[i])){
//cout<<t[i]<<endl;
if(t[i]==' '){
tmp[tmptop]='\n';
ll hares=hash_f(tmp,tmptop);
if(hares==hash_s){
ans++;
if(first==-)
first=be;
}
tmptop=;
be=i+;
}
else{
tmp[tmptop]=tolower(t[i]);
tmptop++;
}
i++;
} if(first==-)
printf("-1\n");
else
printf("%d %d\n",ans,first); }
05-08 15:10