1タイトル
質問A:アニマルの紹介(アニマル)
[命題者:外部Import]の
制限時間:1.000秒メモリ制限:64メガバイト
タイトル説明
のジャンプに動物園、チチの幸せに。動物園の動物はプロフィールうん添付依存し、慎重に動物を観察する必要がある場合:うわー、ここうん動物の多くは、トラは、ライオンが......さておき楽しみに、チチは母親の教えを忘れていなかったがあります。
動物の紹介だけでなく、それの元の英語版!自分の英語のレベルを誇示するために、チチは、導入に何度も動物の名前、各動物を登場彼女の母親に言いました。注:チチは小文字のみを知っていた、と彼女は言葉だけの動物、サルを知っていたか、彼女はsmonkeyまたはsmonkeysワード猿の登場です思いました。
あなたは、タスク集集を完了するためにそれをプログラムすることができますか?
入力
入力ファイルの列N + 2合計:
1ライン数N(N <= 3000)、プロファイルは、n行の動物が存在することを示しています。
2番目の単語を行い、それが動物の名前チチのノウハウを意味しています。
長さの各少ない動物プロファイルによって表される文字列250の動作よりも、n行が続きます。
出力
出力ファイル1行の合計、チチは何回で導入を識別することができ、動物の言葉がありました。
サンプル入力のコピー
2
スネーク
スネークIS A細長いや動物の。
ヘビや足の足'NOを持っています。
サンプル出力のコピー
。1
2解析されました
2.1問題の意味
テキスト文字列の複数の出現総数パターン文字列を求めます。
2.2アイデア
3参照コード
#include <cstdio>
#include <string>
#include <iostream>
using std::cin;
using std::string;
const int MAXN = 3010;
int res = 0;
int nextval[MAXN];
void getNextval(string s, int len){
int j = -1;
nextval[0] = -1;
for (int i = 1; i < len; ++i)
{
while(j != -1 && s[i] != s[j+1]){
j = nextval[j];
}
if(s[i] == s[j+1]){
j++;
}
if(j == -1 || s[i+1] != s[j+1]){
nextval[i] = j;
}else{
nextval[i] = nextval[j];
}
}
}
int KMP(string pattern, string text){
getNextval(pattern, pattern.length());
int ans = 0, j = -1;
for (int i = 0; i < text.length(); ++i)
{
while(j != -1 && text[i] != pattern[j + 1]){
j = nextval[j];
}
if(text[i] == pattern[j+1]){
j++;
}
if(j == pattern.length() - 1){
ans++;
j = nextval[j];
}
}
return ans;
}
int main(int argc, char const *argv[])
{
int n;
string text, pattern;
scanf("%d", &n);
getchar();
getline(cin , pattern);
for (int i = 0; i < n; ++i)
{
getline(cin, text);
res += KMP(pattern, text);
}
printf("%d\n", res);
return 0;
}