洛谷 P1308 統計單詞數
阿新 • • 發佈:2019-01-20
www. name mes isdigit fine slow ash cout ret
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[15];
char t[1000005];
char tmp[1000005];
int tmptop=0;
int s1,t1;
ll hash_s;
ll hash_f(char* s,int l){
ll ha=0;
for(int i=0;i<l;i++){
ha=ha*23333+s[i];
}
return ha;
}
int main(){
scanf("%s",s);
getchar();
fgets(t,1000005,stdin);
s1=strlen(s);
for(int i=0;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=0;
int first=-1;
int be=0;
int i=0;
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==-1)
first=be;
}
tmptop=0;
be=i+1;
}
else{
tmp[tmptop]=tolower(t[i]);
tmptop++;
}
i++;
}
if(first==-1)
printf("-1\n");
else
printf("%d %d\n",ans,first);
}
洛谷 P1308 統計單詞數