Codeforces 149 E. Martian Strings
正反两遍扩展KMP,维护公共长度为L时。出如今最左边和最右边的位置。
。
。。
然后枚举推断。。。
2 seconds
256 megabytes
standard input
standard output
During the study of the Martians Petya clearly understood that the Martians are absolutely lazy. They like to sleep and don't like to wake up.
Imagine a Martian who has exactly n eyes located in a row and numbered from the left to the right from 1 to n.
When a Martian sleeps, he puts a patch on each eye (so that the Martian morning doesn't wake him up). The inner side of each patch has an uppercase Latin letter. So, when a Martian wakes up and opens all his eyes he sees a string s consisting
of uppercase Latin letters. The string's length isn.
"Ding dong!" — the alarm goes off. A Martian has already woken up but he hasn't opened any of his eyes. He feels that today is going to be a hard day, so he wants to open his eyes and see something good. The Martian considers only m Martian
words beautiful. Besides, it is hard for him to open all eyes at once so early in the morning. So he opens two non-overlapping segments of consecutive eyes. More formally, the Martian chooses four numbers a, b, c, d,
(1 ≤ a ≤ b < c ≤ d ≤ n) and opens all eyes with numbers i such
that a ≤ i ≤ b or c ≤ i ≤ d. After
the Martian opens the eyes he needs, he reads all the visible characters from the left to the right and thus, he sees some word.
Let's consider all different words the Martian can see in the morning. Your task is to find out how many beautiful words are among them.
The first line contains a non-empty string s consisting of uppercase Latin letters. The strings' length is n (2 ≤ n ≤ 105).
The second line contains an integer m (1 ≤ m ≤ 100)
— the number of beautiful words. Next m lines contain the beautiful words pi,
consisting of uppercase Latin letters. Their length is from 1 to 1000.
All beautiful strings are pairwise different.
Print the single integer — the number of different beautiful strings the Martian can see this morning.
ABCBABA
2
BAAB
ABBA
1
Let's consider the sample test. There the Martian can get only the second beautiful string if he opens segments of eyes a = 1, b = 2 and c = 4, d = 5 or
of he opens segments of eyes a = 1, b = 2 and c = 6, d = 7.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int INF=0x3f3f3f3f; const int maxn=101000; char T[maxn],P[maxn/100];
int next[maxn/10],ex[maxn]; char rT[maxn],rP[maxn/100];
int rnext[maxn/100],rex[maxn];
int LEFT[maxn/100],RIGHT[maxn/100]; int n,q,m; void pre_exkmp(int next[],char P[],int m)
{
next[0]=m;
int j=0,k=1;
while(j+1<m&&P[j]==P[j+1]) j++;
next[1]=j;
for(int i=2;i<m;i++)
{
int p=next[k]+k-1;
int L=next[i-k];
if(i+L<p+1) next[i]=L;
else
{
j=max(0,p-i+1);
while(i+j<m&&P[i+j]==P[j]) j++;
next[i]=j; k=i;
}
}
} void get_limit(int kind,int pos,int ex)
{
if(kind==0)
{
if(LEFT[ex]==INF)
{
LEFT[ex]=pos;
}
}
else if(kind==1)
{
if(RIGHT[ex]==-1)
{
RIGHT[ex]=n-1-pos;
}
}
} void gao(int kind,int m)
{
if(kind==1)
{
int last=-1;
for(int i=m;i>=1;i--)
{
if(RIGHT[i]<last)
{
RIGHT[i]=last;
}
else
{
last=RIGHT[i];
}
}
}
else
{
int last=INF;
for(int i=m;i>=1;i--)
{
if(LEFT[i]>last)
{
LEFT[i]=last;
}
else
{
last=LEFT[i];
}
}
}
} ///kind 0...LEFT 1...RIGHT
void exkmp(int kind,int& mx,int ex[],int next[],char P[],char T[],int n,int m)
{
pre_exkmp(next,P,m);
int j=0,k=0;
while(j<n&&j<m&&P[j]==T[j]) j++;
ex[0]=j; mx=max(mx,ex[0]);
get_limit(kind,0,ex[0]); for(int i=1;i<n;i++)
{
int p=ex[k]+k-1;
int L=next[i-k];
if(i+L<p+1) ex[i]=L;
else
{
j=max(0,p-i+1);
while(i+j<n&&j<m&&T[i+j]==P[j]) j++;
ex[i]=j; k=i;
}
mx=max(mx,ex[i]);
get_limit(kind,i,ex[i]);
}
} int main()
{
scanf("%s",T);
n=strlen(T);
for(int i=0;i<n;i++)
rT[i]=T[n-1-i];
int ans=0;
scanf("%d",&q);
while(q--)
{
scanf("%s",P);
int m=strlen(P);
for(int i=0;i<m;i++)
rP[i]=P[m-1-i]; memset(LEFT,63,sizeof(LEFT));
memset(RIGHT,-1,sizeof(RIGHT)); int mx1=0,mx2=0;
exkmp(0,mx1,ex,next,P,T,n,m);
gao(0,m);
exkmp(1,mx2,rex,rnext,rP,rT,n,m);
gao(1,m); if(mx1+mx2<m) continue; bool flag=false; for(int len=1;len<m&&flag==false;len++)
{ if(LEFT[len]==INF||RIGHT[m-len]==-1) continue;
if(LEFT[len]+len-1<RIGHT[m-len]-(m-len)+1)
{
ans++;
flag=true;
}
}
}
printf("%d\n",ans);
return 0;
}
Codeforces 149 E. Martian Strings的更多相关文章
- CodeForces 149E Martian Strings exkmp
Martian Strings 题解: 对于询问串, 我们可以从前往后先跑一遍exkmp. 然后在倒过来,从后往前跑一遍exkmp. 我们就可以记录下 对于每个正向匹配来说,最左边的点在哪里. 对于每 ...
- xtu summer individual-4 D - Martian Strings
Martian Strings Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
- Codeforces 482C Game with Strings(dp+概率)
题目链接:Codeforces 482C Game with Strings 题目大意:给定N个字符串,如今从中选定一个字符串为答案串,你不知道答案串是哪个.可是能够通过询问来确定, 每次询问一个位置 ...
- codeforces 149E . Martian Strings kmp
题目链接 给一个字符串s, n个字符串str. 令tmp为s中不重叠的两个连续子串合起来的结果, 顺序不能改变.问tmp能形成n个字符串中的几个. 初始将一个数组dp赋值为-1. 对str做kmp, ...
- 【24.34%】【codeforces 560D】Equivalent Strings
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CodeForces 682D Alyona and Strings (四维DP)
Alyona and Strings 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/D Description After re ...
- codeforces 518A. Vitaly and Strings
A. Vitaly and Strings time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces 985 F - Isomorphic Strings
F - Isomorphic Strings 思路:字符串hash 对于每一个字母单独hash 对于一段区间,求出每个字母的hash值,然后排序,如果能匹配上,就说明在这段区间存在字母间的一一映射 代 ...
随机推荐
- Problem F: 分数类的类型转换
Description 封装一个分数类Fract,用来处理分数功能和运算,支持以下操作: 1. 构造:传入两个参数n和m,表示n/m:分数在构造时立即转化成最简分数. 2. show()函数:分数 ...
- 服务器 : Apache Tomcat - 理解架构层次
文章概览 相信很多接触java的人都对Tom猫有着多少的熟悉,就个人而言,本来只知道Tom简单的操作与配置,就像裹上一层纱,迷迷糊糊的. Tomcat的书籍本来就不多,高分的还是很久之前的版本,直到最 ...
- 基于Django的python验证码
验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 验证码视 ...
- JavaScript正则表达式知识点
通过学习imooc课程<JavaScript正则表达式>http://www.imooc.com/video/12539,对视频教学内容做一个知识整理. 一个正则表达式在线工具:http: ...
- Attribute在.NET编程中的应用(三)
用于参数的Attribute 在编写多层应用程序的时候,你是否为每次要写大量类似的数据访问代码而感到枯燥无味?比如我们需要编写调用存储过程的代码,或者编写T_SQL代码,这些代码往往需要传递各种参数, ...
- [转载] Dubbo架构设计详解
转载自http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合 ...
- csv格式的数据存储到mysql
python写的,有点冗余,先码出来~~~~ 这是data_stored.py的代码 # -*- coding:utf-8 -*- # 存数据到mysql (只存了时间数字) import pymys ...
- 查看oracle数据库里哪些语句耗时最长或者效率最低
CPU: select * from (select v.sql_id, v.child_number, v.sql_text, v.elapsed_time, v.cpu_time, v.disk_ ...
- JMS学习之路(一):整合activeMQ到SpringMVC 转载:http://www.cnblogs.com/xiaochangwei/p/5426639.html
JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...
- Git命令行对照表
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...