链接:
http://codeforces.com/problemset/problem/149/E
题目大意:
给出字符串S, 然后再给m个字符串T,判断有几个T是可以在S中找到坐标a,b,c,d,
(1 ≤ a ≤ b < c ≤ d ≤ n),使得S【a...b】+S【c...d】
= T.
分析与总结:
先找T的前缀,要找所有长度的前缀的最后一个字母在S中第一次出现的位置,这个过程只需要进行一次KMP运算便可以保存下来。
然后就是把寻找后缀,把S和T都逆序存好,再进行一次KMP运算找后缀,看是否可以找到一个长度为x的后缀的位置在一个长度为len-s的前缀(如果存在)位置之后,如果可以找到就可判断这个T可以有S中的组成。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 100005;
char S[MAXN], T[1005];
char str[MAXN];
int Right[MAXN]; // 各个长度的前缀的尾部最左边的那个位置
int next[MAXN];
void getNext(char* P,int* f){
int m=strlen(P);
f[0] = f[1] = 0;
for(int i=1; i<m; ++i){
int j=f[i];
while(j && P[i]!=P[j]) j=f[j];
f[i+1] = P[i]==P[j]?1+j:0;
}
}
bool find(char* S,char* T,int* f,int flag){
getNext(T,f);
int n=strlen(S);
int m=strlen(T);
int j=0;
for(int i=0; i<n; ++i){
while(j && S[i]!=T[j]) j=f[j];
if(S[i]==T[j]) ++j;
if(flag==1 && j && Right[j]==-1){
Right[j] = i;
}
else if(flag==2){
if(j && Right[m-j]!=-1 && Right[m-j]<n-i-1){
return true;
}
}
}
return false;
}
void rev(char* S,int len){
char ch;
for(int i=0,k=len-1; i<len/2; ++i,--k){
ch=S[i]; S[i]=S[k]; S[k]=ch;
}
}
void revcpy(char* S,char* str,int len){
for(int i=len-1, k=0; i>=0; --i){
str[k++] = S[i];
}
str[len] = '\0';
}
int main(){
int m;
scanf("%s",S);
scanf("%d",&m);
int cnt=0;
while(m--){
scanf("%s",T);
memset(Right, -1, sizeof(Right));
find(S,T,next,1);
revcpy(S,str,strlen(S));
rev(T,strlen(T));
if(find(str,T,next,2))
++cnt;
}
printf("%d\n",cnt);
return 0;
}
—— 生命的意义,在于赋予它意义士。
原创http://blog.csdn.net/shuangde800,By
D_Double (转载请标明)
分享到:
相关推荐
开源项目-google-martian.zip,Martian - HTTP proxy designed for E2E testing
1我们按照“ martian source”在Linux内核当中进行检索,发现该日志错误是在ip_handle_martian_source()这个函数中打印的 /* https://github.com/torvalds/linux/blob/master/net/ipv4/route.c */ static void ip_...
Martian Aptos Wallet_v0.2.2.crx
Structural response of an inflatable module for a lunar&Martian base
( require '[martian.core :as martian] '[martian.clj-http :as martian-http]) ( let [m ( martian-http/bootstrap-openapi " https://pedestal-api.herokuapp.com/swagger.json " )] ( martian/response-for m ...
Martian-Harmony-3.0 印度第一个机器人乐队 抽象的 这个项目的想法是制作印度第一个机器人乐队。该团队在过去三年中一直致力于这个项目,并且每年团队都试图构建能够演奏特定乐器的机器人。在过去两年中,三个乐器...
火星机器人追踪器 追踪火星上的所有机器人! 作为的第一关,我使用了在您的终端中运行的基于 javascript 的测试驱动解决方案。 安装 npm install 跑步 jasmine-node spec/ --verbose
Martian框架是 Magician项目的一个超集, 整合了Magician的大部分组件,并进行了少量的二次封装, 使其能够更加快捷的 搭建一个后端服务 运行环境 最低支持JDK 11+ 搭建步骤 一、导入依赖 <groupId>...
基于AIO的网络编程包项目简介Martian-Server 是一个基于AIO的网络编程包,支持http,websocket等协议【暂时只支持http】安装步骤一、导入依赖<dependency> <groupId>...!-- 这个是日志包,支持任意可以跟slf4j桥接的包 ...
Martian-Harmony-2.0 这个想法是建立一个可以像人类一样演奏乐器的机器人。 它由各种乐器组成,如长笛、键盘、吉他等。所有这些乐器都使用不同的机制演奏。 团队成员 希瓦姆·马卢 什哈尔·巴尔加瓦 乌梅什·...
基于AIO的网络编程包 ... <artifactId>Martian-server 最新版 <!-- 这个是日志包,支持任意可以跟slf4j桥接的包 --> <groupId>org.slf4j <artifactId>slf4j-jdk14 <version>1.7.12 二
这是一个Blitz Basic程序,可模拟Martian Chess的4人游戏。
MartianDice:Martian Dice游戏,包括最佳玩法
git clone https://github.com/HurricaneJames/martian-robots.git npm install # if you want to see tests npm test # launch the runner npm run start # load browser at http://localhost:8090 使用 输入文本...
martian_chess_engine:两人火星棋的引擎
火星框架父 超级POM 阿帕奇Maven <groupId>io.github.marsianer <artifactId>martian-framework-parent <version>21.04.00.00 执照 根据Apache License 2.0分发。 有关更多信息,请参见。
寻找Martian Night 。 单击安装进行安装。 代码>首选项>颜色主题>火星之夜 贡献 克隆此仓库并在VS Code中打开 打开运行View → Run 单击Launch Extension 。 这将打开另一个VS代码编辑器 对Martian Night-color-...
火星框架jaxb 该软件包提供了有用的辅助类,这些辅助类简化了的使用。... <artifactId>martian-framework-jaxb <version>21.04.00.00 执照 根据Apache License 2.0分发。 有关更多信息,请参见。
或作为插件构建go build -buildmode=plugin -o krakend-martian_header-ro.so ./header/rollover ./krakend run -c krakend.json 笔记 网站开发作为系统管理员 如何使用Golang插件和KrakenD