题目背景

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

题目描述

老师给了小明一篇长度为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. c++重载输入输出运算符

    1 最好打断点看看哦 2例子 #include <iostream> using namespace std; class Complex2 { public: Complex2(, ) ...

  2. 微信小程序开发之页面跳转并携带参数

    接口: wx.navigateTo({url:......})   保留当前页面,跳转到应用内指定URL页面,导航栏左上角有返回按钮 wx.redirecTo({url:.....})       关 ...

  3. myeclipse 去掉spring特性支持

    myeclipse10.0 去掉spring支持  手工修改工程目录下的.project文件中相关的内容 删除<nature>com.genuitec.eclipse.springfram ...

  4. 1090 Highest Price in Supply Chain (25 分)

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  5. 算法学习--Day8

    今天重拾算法复习. 今天学习了两个类型的算法——并查集与最小生成树(MST) 简单记录一下并查集的大致内容. 一.并查集的内容大致作用为查找当前图中的点有几个集合. 该算法起到查询分组的情况.通过给定 ...

  6. HDU 3729【二分匹配】

    题意: 给出n个同学的排名,代表每个排名在哪个区间,要求保证最多人说的是实话,并在此前提下求一个说真话人最大字典序. 思路: 最后感觉就是点去填区间,点和区间建个边,然后跑个二分图,然后sort一发. ...

  7. unity常用插件

    Unity3D常用插件,网址:http://jingyan.baidu.com/article/7f766daf4ef2844100e1d079.html ,想想自己也有小半年unity经验了,于是整 ...

  8. c#file类读写

    private void button4_Click(object sender, EventArgs e) { FileStream fs = File.OpenRead(textBox1.Text ...

  9. icekingdom(2018.10.17)

    一句话题意:给你一颗n个点的树,节点初始状态下都是白色,有q次修改,每次修改会把[li,ri]区间内的点染成黑色,并且问黑色点能形成几个联通块,然后会将所有点染回白色.(也就是说每次都只有[li,ri ...

  10. web.xml中一个filter配置多个url-pattern

    需要在filter标签后添加多个filter-mapping标签,一个url-pattern就对应一个filter-mapping标签,不能直接把多个url-pattern配置到同一个filter-m ...