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值,然后排序,如果能匹配上,就说明在这段区间存在字母间的一一映射 代 ...
随机推荐
- 乐视(LeTV)占用8080端口
- linux-more
more 这个命令可以用来分页查看大篇幅的文件内容非常有效 命令参数: -num : 这里的num 是一个数字,用来指定分页显示时每页的行数 +num : 指定从文件的第几行num开始显示 ... ...
- socket阻塞IO流程图
单线程 多线程
- unity下跨平台excel读写
这是以前写的跨windows和ios读写excel的工具,因为原来导表工具引用的第三方读写excel的dll只能在windos下使用,造成要在mac机器上跑PC端或者打包的时候,每次都要先在windo ...
- Velocity(2)——常用语法
Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象.作为一个比较完善 ...
- Linux系列教程(二十)——Linux的shell概述以及如何执行脚本
从这篇博客开始,我们将进入Linux的shell脚本的学习,这对于Linux学习爱好者而言是特别重要的一节,也是特别有意思的一节,shell 脚本就像我们知道的Java,php类似的编程语言一样,通过 ...
- Android设置屏幕方向
设置方法:在AndroidManifest.xml中的Activity里加一个属性android:screenOrientation.例如设置该Activity为横向 <activity and ...
- 【Java框架型项目从入门到装逼】第二节 - Spring框架 AOP的丧心病狂解说,你喜欢露娜的月下无限连吗?
继续上一节的内容,多几个jar包: aop技术是面向切面编程思想,作为OOP的延续思想添加到企业开发中,用于弥补OOP开发过程中的缺陷而提出的编程思想.AOP底层也是面向对象:只不过面向的不是普通的O ...
- Unity3D游戏xlua轻量级热修复框架
这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察了xlua和tolua,最终选择了xlua,原因如下: 1)项目已经到了后期,线上版本迭代了 ...
- IT连创业系列:App产品上线后,运营怎么搞?(上)
又是一阵一阵的时光过去了,今夜,码的不是代码,是文字,继续和大伙分享创业的这一路历程. 话说,在突破技术的领域,IT连和IT恋上线后,慢慢走上运营这条路时,发现自己经常容易迷失. 毕竟,做为一名技术型 ...