2016西電校試合ネット試合Problem C万神を探す

4381 ワード

Problem C
に質問
ある人は後輩を教育する時言います:“電気院の万神、あなた達より高いのはどこに行ったか分からないで、私は彼と談笑して風生します!”しかし、弟のtoo young、too simpleは、万神を全然知らないので、自分で百度で探すしかありません.検索結果と万神の関連度を測るために、後輩は文章の中で「万神」という字が現れる回数を知りたいと思っています.彼を助けてくれませんか.
入力フォーマット
複数セットのデータが含まれていることを入力し、ファイルの終了まで処理します.各データのセットにおいて、第1の行は整数nを含み、このデータのセットの行数を表す.その後n行は後輩が見つけた文章を表す.中国語の符号化問題を避けるために、文章はピンインで与えられる.保証文章は大文字の英字(英語)、小文字の英字(ピンイン)、句点「.」、コンマ1≦n≦100を保証し、入力ファイルの総長は5 MBまでである.
出力フォーマット
各グループのデータについて、文章中の「万神」の2文字(ピンインは「wanshen」で、引用符は含まれていない)の出現回数を出力します.
入力サンプル
5 wanshenshixidianACM dediyidashen.erqiew anshendeDOTAyedadeh enhao.womendouhenOR Zwanshen. 1 WANSHEN.
出力サンプル
3 0
サンプル解釈
第1組の例では、「万神」が文章の2行目と3行目を越えていることに注意してください.2組目の例では,英字配列「WANSHEN」が万神を表すとは思わない.
構想
KMPテンプレート、最長共通接尾辞
/************************************************************************* > File Name: c.cpp > Author: dulun > Mail: [email protected] > Created Time: 2016 04 20      13 04 24  ************************************************************************/

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;

const int N = 50086;
int nxt[10];
char a[101][N];
char p[10] = "wanshen";
int n;
int l = strlen(p);
void init()
{
    int k = 0;
    nxt[0] = 0;
    for(int i = 1; i < l; i++)
    {
        while(k && p[i] != p[k]) k = nxt[k-1];
        if(p[i] == p[k]) k++;
        nxt[i] = k;
    }
}

int kmp()
{
    int ans = 0;
    int k = 0;
    for(int i = 0; i < n; i++)
    {
        int len = strlen(a[i]);
        for(int j = 0; j < len; j++)
        {
            while(k && a[i][j] != p[k]) k = nxt[k-1];
            if(p[k] == a[i][j]) k++;
            if(k == l)
            {
                ans++;
                k = 0;
            }
        }
    }
    return ans;
}

int main()
{
    init();
    while(cin>>n)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%s", a[i]);
        }
        printf("%d
"
, kmp()); } return 0; }