题目背景

小明对英语一窍不通,令老师十分头疼。于是期末考试前夕,小明被逼着开始背单词……

题目描述

老师给了小明一篇长度为N的英语文章,然后让小明背M个单词。为了确保小明不会在背单词时睡着,老师会向他提Q个问题,每次老师随机选择一个区间L..R,小明要回答在这段文字中他背过的单词总共出现过多少次。

输入输出格式

输入格式:

第一行两个整数M、Q如前所述。第二行为英语文章。接下来M行每行一个需要背的单词。接下来Q行每行一个询问,包含两个整数L、R(含端点),即给定的文字区间。

输出格式:

Q行,对每个询问输出一行表示答案。

输入输出样例

输入样例#1:

3 3
abcabcbc
abc
bc
a
1 3
6 7
1 8
输出样例#1:

3
0
7

说明

数据范围:

对于30%的数据,1<=N<=10^3,1<=Q<=10^3

对于60%的数据,1<=N<=10^5,1<=Q<=10^5

对于100%的数据,1<=N<=10^6,1<=M<=10,1<=Q<=10^6,1<=每个单词的长度<=N,1<=L<=R<=N

提示:数据较大,请大家尽量采取高效率的读入输出方法。

正解 m次kmp 统计前缀和。

不知为什么的错解:AC自动机,卡了90分钟 。不明白为什么,感觉挺对,也可能是我写得丑。

每次询问取出x~y的子串 跑AC自动机,路过大神帮忙看一下。。(明知不会有大神路过,却依旧恬不知耻)..

屠龙宝刀点击就送

#include <ctype.h>
#include <cstdio> const int N = 1e6+;
int que[N],num[N],cnt[N],trie[N][],fail[N],n,Q,siz=;
char text[N],a[N];
inline void ins(int k)
{
int p=;
for(char *q=a;*q;++q)
{
int id=*q-'a';
if(!trie[p][id]) trie[p][id]=++siz;
p=trie[p][id];
}
cnt[p]++;
num[p]=k;
}
inline void Read(int &x)
{
register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
}
void build()
{
for(int i=;i<=;i++) trie[][i]=;
int l=,r=;
que[++r]=;
for(int now=que[++l];l<=r;now=que[++l])
{
for(int i=;i<=;i++)
{
if(trie[now][i])
{
if(now==) fail[trie[now][i]]=;
else
{
int tmp=fail[now];
for(;tmp;tmp=fail[tmp])
{
fail[trie[now][i]]=trie[tmp][i];
break;
}
if(!tmp) fail[trie[now][i]]=;
}
que[++r]=trie[now][i];
}
}
}
}
int query(int l,int r)
{
int p=,ans=;
for(int i=l-;i<r;++i)
{
int id=text[i]-'a';
for(;!trie[p][id];p=fail[p]);
if(!p) p=;
p=trie[p][id];
int now=p;
for(;now;now=fail[now])
if(num[now]) ans+=cnt[now];
}
return ans;
}
int main()
{
Read(n);
Read(Q);
scanf("%s",text);
for(int i=;i<=n;++i)
{
scanf("%s",a);
ins(i);
}
build();
for(int x,y;Q--;)
{
Read(x);
Read(y);
printf("%d\n",query(x,y));
}
return ;
}

求说为什么错的AC自动机

#include <cstring>
#include <ctype.h>
#include <cstdio>
const int N = 1e6+;
inline void read(int &x)
{
register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
}
int Len,n,Q,los[N],Next[N],sum[N][];
char text[N],word[N];
void kmp(int k,int l)
{
int i=,j=-;
Next[i]=j;
for(;i<l;)
{
if(j==-||word[i]==word[j]) i++,j++,Next[i]=j;
else j=Next[j];
}
i=,j=;
for(;i<Len&&j<l;)
{
if(j==-||text[i]==word[j]) i++,j++;
else j=Next[j];
if(j==l) j=Next[j],sum[i][k]++; }
}
int main()
{
read(n);
read(Q);
scanf("%s",text);
Len=strlen(text);
for(int i=;i<=n;++i)
{
scanf("%s",word);
int len=strlen(word);
kmp(i,len);
los[i]=len;
}
for(int i=;i<=Len;++i)
for(int j=;j<=n;++j)
sum[i][j]+=sum[i-][j];
for(int x,y,ans;Q--;)
{
read(x);
read(y);
ans=;
for(int i=;i<=n;i++)
{
if(x+los[i]-<=y)
ans+=sum[y][i]-sum[x+los[i]-][i];
}
printf("%d\n",ans);
}
return ;
}

洛谷 P2353 背单词的更多相关文章

  1. luogu P2353 背单词

    二次联通门 : luogu P2353 背单词 一眼看过去, 卧槽,AC自动机板子题 写完后T成SB 卧槽10^6 做个篮子啊 重构思路... 恩..Hash + 莫队... 恶心啊.. 找xxy d ...

  2. AC日记——背单词 洛谷 P2353

    背单词 思路: KMP+统计前缀和优化: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 ], ...

  3. 洛谷P2412 查单词 [trie树 RMQ]

    题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...

  4. 洛谷 P1026 统计单词个数 Label:dp

    题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...

  5. 洛谷 P1026 统计单词个数

    题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...

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

    P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...

  7. 洛谷P3966 [TJOI2013]单词(AC自动机)

    题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...

  8. 洛谷1101:单词方阵(DFS)

    题目描述 给一n×nn \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着888个方向的任一方向,同一单词摆放 ...

  9. 洛谷P1019:单词接龙(DFS)

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

随机推荐

  1. springmvc源码分析系列-请求处理流程

    接上一篇-springmvc源码分析开头片 上一节主要说了一下springmvc与struts2的作为MVC中的C(controller)控制层的一些区别及两者在作为控制层方面的一些优缺点.今天就结合 ...

  2. Robot Framework基础学习(一)

    Robot Framework语法学习: 一.变量的声明.赋值与使用 1.变量标识符:每个变量都可以用  变量标识符 ${变量名} 来表示. 2.变量声明:可以在TestSuite上点右键或者在Edi ...

  3. 5、html的body内标签之多行文本及下拉框

    一.多行文本 <textarea name="">默认值</textarea> 二.下拉框 1.单选 <select name="city& ...

  4. 把myeclipse中html/jsp文件的视图调到只看代码

    烦恼———————————————————— 解决方法: ok---------------------------- *.jsp 同理

  5. 洛谷 - P1020 - 导弹拦截 - 最长上升子序列

    https://www.luogu.org/problemnew/show/P1020 终于搞明白了.根据某定理,最少需要的防御系统的数量就是最长上升子序列的数量. 呵呵手写二分果然功能很多,想清楚自 ...

  6. 洛谷 - P2051 - 中国象棋 - 简单dp

    https://www.luogu.org/problemnew/show/P2051 一点都不简单的简单dp. 还是从旧行转移到新行,而不是考虑新行从哪些旧行转移吧. #include<bit ...

  7. MYSQL5.7版本解决sql_mode=only_full_group_by问题

    在安装有些二开框架时会遇到下面的问题,在填写完数据库密码之后他会提示你请在mysql配置文件中修改ql-mode去掉ONLY_FULL_GROUP_BY,但是我们去mysql的配置文件中查找此配置,有 ...

  8. BCG使用

    VC界面库分两大类:一,Direct UI,优点:界面绚丽.二,MFC扩展库.优点:1,方便用户.2,减少开发成本.3,界面相对好看.BCG属于后者,非常是否适合优化办公软件界面. 作者在2008年以 ...

  9. Multi-University板块

    力争补完所有 Multi-University 的"水题",任重而道远. HDU2819[二分匹配与矩阵性质] HDU2844[背包问题(二进制优化)] HDU2824[欧拉函数] ...

  10. ugui batches

    先渲染非重叠,然后渲染重叠 如果两个图不是同一个图集,并且都不重叠,那么按节点挂载顺序渲染   节点挂接多复杂没关系,关键是节点在Canvas下的顺序,绑在同一节点或者全部绑在根节点Canvas下渲染 ...