noip2011普及组T2 统计单词数(stat) KMP算法

才学了KMP,拿这题来练练手……(不过似乎有点小题大做了……

这就是一题水水的KMP模板,匹配若干次,每一次从上次匹配后的位置开始,直到匹配失败。

虽然用的算法“高级”一点,但是居然比暴力慢了40MS啊啊啊……

Code:

 1 #include<iostream>
 2 using namespace std;
 3 const int P=15;
 4 const int S=1000005;
 5 char p[P],s[S];
 6 int next[P],pl,sl;
 7 void getnext(){
 8     next[0]=-1;
 9     int i=0,j=-1;
10     while(i<pl){
11         if(j==-1||s[i]==s[j]){
12           i++,j++;
13           next[i]=j;
14         }else{
15           j=next[j];
16         }
17     }
18 }
19 int KMP(int st){
20     int i=st,j=0;
21     while(i<sl&&j<pl){
22         if(j==-1||s[i]==p[j]){
23           i++,j++;
24         }else{
25           j=next[j];
26         }
27     }
28     return j==pl?(i-j):-1;
29 }
30 int main()
31 {
32     freopen("stat.in","r",stdin);
33     freopen("stat.out","w",stdout);
34     int i,x,ans=0,flag=0,loc;
35     gets(p);
36     gets(s);
37     pl=strlen(p);
38     sl=strlen(s);
39     for(i=0;i<sl;i++)s[i]=tolower(s[i]);
40     for(i=0;i<pl;i++)p[i]=tolower(p[i]);
41     getnext();
42     for(x=KMP(0);x!=-1;x=KMP(x+pl)){
43        if((x==0||s[x-1]==‘ ‘)&&(x+pl>=sl||s[x+pl]==‘ ‘)){
44          if(flag==0){
45            flag=1;
46            loc=x;
47          }
48          ans++;
49        }
50     }
51     if(flag)
52       cout<<ans<<‘ ‘<<loc;
53     else
54       cout<<-1;
55     return 0;
56 }
时间: 2024-10-16 05:12:00

noip2011普及组T2 统计单词数(stat) KMP算法的相关文章

noip2011普及组——统计单词数

统计单词数 时间限制:1 s 内存限制:128MB [问题描述]一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数.现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2). [输入]输入

洛谷 P1308 统计单词数【字符串+模拟】

P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章 中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 ). 输入输出格式 输入格式: 输入文件

JSK-27321 统计单词数【字符串】

统计单词数 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置. 注意:匹配单词时,不区分大小写,但要求完全匹配, 即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1), 如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2). 输入格式 第 1 行为一个字符串,其中只含字母,表示

NOIP2011 普及组 T3 洛谷P1309 瑞士轮

今天题做太少,放道小题凑数233 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长. 本题中介绍的瑞士轮赛制,因最早使用于1895年在瑞士举办的国际象棋比赛而得名.它可以看作是淘汰赛与循环赛的折衷,既保证了比赛的稳定性,又能使赛程不至于过长. 题目描述 2*N 名编号为 1~2N 的选手共进行R 轮比赛.每轮比赛开始前,以及所有比赛结束后,都

洛谷-统计单词数-简单字符串

题目描述 Description 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数.  现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章 中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 ). 输入输出格式 Input/out

Ruby中定义wc方法来统计单词数和行数等

在Ruby中我们定义一个wc方法,用来统计文件中出现的文本行数.单词数和字符数,ruby代码程序如下: def wc(filename)   nline = nword = nchar = 0   File.open(filename) do |io|     io.each_line do |line|       words = line.split(/\s+/).reject{|w| w.empty? }       #本例中使用了split方法分割单词,当行首有空白字符时,split方法

NOIP2008 普及组T2 排座椅 解题报告-S.B.S

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道.于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么

【基础练习】【字符串处理】noip2011普及组第2题 统计单词数题解

这又是一道成功加入"容易吗"系列的基础题= =原本很简单,可是我一开始太大意看错了题,以为是让输出该单词是第几个单词,实际上应该输出该单词的首字母在第几个位置:改过后只得了二十分,看了一组数据,原来第一个单词前面可以有前导空格--幸亏其他单词前没有,否则还真不知道怎么办:实现的时候又出了各种问题.于是我决定总结一下. 题目: 给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大

NOIP2010普及组--数字统计

分析:一个循环就可以搞定,但是时间有点长,现在还在改善,初步代码如下: ps:注意一个数中若有多个2都要算 1 #include <stdio.h> 2 int main(int argc, char *argv[]) 3 { 4 int l,r,i; 5 int num=0; 6 int s; 7 freopen("two.in","r",stdin); 8 freopen("two","w",stdout);