洛谷 P2353 背单词
题目背景
小明对英语一窍不通,令老师十分头疼。于是期末考试前夕,小明被逼着开始背单词……
题目描述
老师给了小明一篇长度为N的英语文章,然后让小明背M个单词。为了确保小明不会在背单词时睡着,老师会向他提Q个问题,每次老师随机选择一个区间L..R,小明要回答在这段文字中他背过的单词总共出现过多少次。
输入输出格式
输入格式:
第一行两个整数M、Q如前所述。第二行为英语文章。接下来M行每行一个需要背的单词。接下来Q行每行一个询问,包含两个整数L、R(含端点),即给定的文字区间。
输出格式:
Q行,对每个询问输出一行表示答案。
输入输出样例
3 3
abcabcbc
abc
bc
a
1 3
6 7
1 8
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 背单词的更多相关文章
- luogu P2353 背单词
二次联通门 : luogu P2353 背单词 一眼看过去, 卧槽,AC自动机板子题 写完后T成SB 卧槽10^6 做个篮子啊 重构思路... 恩..Hash + 莫队... 恶心啊.. 找xxy d ...
- AC日记——背单词 洛谷 P2353
背单词 思路: KMP+统计前缀和优化: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1000005 ], ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- 洛谷 P1026 统计单词个数 Label:dp
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- 洛谷 P1026 统计单词个数
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- 洛谷 P1308 统计单词数【字符串+模拟】
P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...
- 洛谷P3966 [TJOI2013]单词(AC自动机)
题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...
- 洛谷1101:单词方阵(DFS)
题目描述 给一n×nn \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着888个方向的任一方向,同一单词摆放 ...
- 洛谷P1019:单词接龙(DFS)
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...
随机推荐
- eclipse项目从编程到打jar包到编写BashShell执行
eclipse项目从编程到打jar包到编写BashShell执行 一.创建Java项目,并编写项目(带额外jar包) 二.打jar包 三.编写BashShell执行 其中一以及二可以参考我的博客 Ec ...
- B. Vanya and Food Processor【转】
B. Vanya and Food Processor time limit per test 1 second memory limit per test 256 megabytes input s ...
- codevs-1205
1205 单词翻转 题目描述 Description 给出一个英语句子,希望你把句子里的单词顺序都翻转过来 输入描述 Input Description 输入包括一个英语句子. 输出描述 Output ...
- vsftpd总结
1 vsftps配置文件详解 (1)/user/sbin/vsftpd 主程序 (2)/etc/rc.d/init.d/vsftpd 启动脚本 (3)/etc/pam.d/vsftpd (file= ...
- 【Linux学习】Linux系统管理1—进程管理
Linux系统管理1-进程管理 一.Linux的三种进程 Linux包括3中不同类型的进程: 交互进程:由一个shell启动的进程.交互进程可以在前后台运行 批处理进程:该进程和终端无联系,是一个进程 ...
- Jmeter调用JAVA jar包传参
http://blog.csdn.net/xiazdong/article/details/7873767#
- 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块
https://www.luogu.org/problemnew/show/P2257 求 \(n,m\) 中 \(gcd(i,j)==p\) 的数对的个数 求 $\sum\limits_p \sum ...
- 201621123016《Java程序设计》第1周学习总结
1. 本周学习总结 本周的学习内容:java的发展历史,java程序设计环境,java简单语法. java与c++一样是一门面向对象的程序设计语言(相比于c++它是一门更彻底的面向对象的程序设计语言) ...
- Integrative Analysis of MicroRNAome, Transcriptome, and Proteome during the Limb Regeneration of Cynops orientalis (文献分享一组-翁海玉)
文献名:Integrative Analysis of MicroRNAome, Transcriptome, and Proteome during the Limb Regeneration of ...
- sql server随机排序和随机取出n条数据
问题:博主在2010-2011学年,广东技术师范大学大四的时候,去过红海人力集团面试数据库职位,很清楚记得当时有一道笔试题目是:编写sql从表里面随机取出10条记录. 解决方案:在sql server ...