2016西电校赛网络赛 Problem C 寻找万神
2016-04-20 20:04
477 查看
Problem C
问题某人在教育学弟时说:“电院的万神,比你们高的不知道哪里去了,我和他
谈笑风生!”但是学弟 too young,too simple,根本不认识万神,只好自己到百
度上搜。
为了衡量搜索结果和万神的相关程度,学弟希望知道一篇文章中“万神”二
字出现的次数。你能帮助他吗?
输入格式
输入包含多组数据,请处理到文件结束。每组数据,第一行包含整数 n,表示这组数据的行数。之后 n 行表示学弟搜
到的文章。为了避免中文编码问题,文章用拼音给出。
保证文章只包含大写英文字母(英文)、小写英文字母(拼音)、句号 “.” 、
逗号”,” 。
保证 1 ≤ n ≤ 100,输入文件总长度至多是 5MB 。
输出格式
对于每组数据,输出文章中“万神”二字(拼音为 “wanshen”,不含引号)的出现次数。
输入样例
5wanshenshixidianACM
dediyidashen.erqiew
anshendeDOTAyedadeh
enhao.womendouhenOR
Zwanshen.
1
WANSHEN.
输出样例
30
样例解释
对于第一组样例,注意“万神”跨越了文章的第 2 行和第 3 行。对于第二组样例,我们不认为英文字母序列 “WANSHEN” 表示万神。
思路
KMP模板,,最长公共前后缀/************************************************************************* > File Name: c.cpp > Author: dulun > Mail: dulun@xiyoulinux.org > 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] ; 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\n", kmp()); } return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置