CF 149E Martian Strings(KMP)
轉載請註明出處,謝謝http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
題意:給了一個母串,然後有多個匹配串,問在母串中是否能找到不重疊兩個子串,拼接成匹配串
http://codeforces.com/problemset/problem/149/E
我的做法是,對於每一個匹配串
正向KMP一次,記錄對於匹配串的每一個長度在模式串能匹配的最左邊,也就是首次匹配的位置
然後將母串和匹配串都反向,再KMP一次
然後列舉長度 ,判斷是否有重疊
感覺還是不錯的題,主要是KMP現在都不會了,SAD...
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<set>
#include<string>
#include<queue>
#define inf 1600005
#define M 40
#define N 100005
#define maxn 300005
#define eps 1e-12
#define zero(a) fabs(a)<eps
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define mem(a,b) memset(a,b,sizeof(a))
#define LL long long
#define MOD 1000000007
#define lson step<<1
#define rson step<<1|1
#define sqr(a) ((a)*(a))
#define Key_value ch[ch[root][1]][0]
#define test puts("OK");
#define pi acos(-1.0)
#define lowbit(x) ((-(x))&(x))
#define HASH 1331
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
int next[1005];
char str[100005],str_2[100005],pat[1005];
int m;
int l[1005],r[1005];
void get_next(char *s,int len){
next[0]=-1;
int i=0,j=-1;
while(i<len){
if(j==-1||s[i]==s[j]){
i++;j++;
if(s[i]==s[j]) next[i]=next[j];
else next[i]=j;
}
else j=next[j];
}
}
void match(char *pat,int lp,char *str,int ls,int *dp){
int i=0,j=0;
while(i<lp&&j<ls){
if(i==-1||pat[i]==str[j]){
i++;j++;
dp[i]=min(dp[i],j);
}
else i=next[i];
if(i==lp) i=next[i];
}
}
void Init(int len){
l[0]=r[0]=0;
for(int i=1;i<=len;i++){
l[i]=inf;
r[i]=inf;
}
}
int main(){
//freopen("input.txt","r",stdin);
while(scanf("%s",str)!=EOF){
int cnt=0,length=strlen(str);
for(int i=0;i<length;i++)
str_2[i]=str[length-1-i];
scanf("%d",&m);
while(m--){
scanf("%s",pat);
int len=strlen(pat);
if(len==1) continue;
Init(len);
get_next(pat,len);
match(pat,len,str,length,l);
for(int i=0;i<len/2;i++){
swap(pat[i],pat[len-i-1]);
}
get_next(pat,len);
match(pat,len,str_2,length,r);
for(int i=1;i<=len;i++){
//cout<<i<<" "<<l[i]<<" "<<r[len-i]<<endl;
if(l[i]+r[len-i]<=length){
cnt++;
break;
}
}
}
printf("%d\n",cnt);
}
return 0;
}
相關文章
- CF482C Game with StringsGAM
- CF985F Isomorphic Strings (雜湊)
- POJ--2406Power Strings+KMP求字串最小週期KMP字串
- CF1902E. Collapsing Strings-LCP、字典樹
- POJ 2406-Power Strings(重複子串-KMP中的next陣列)KMP陣列
- CF 119D String Transformation(KMP,雜湊,列舉,各種優化)ORMKMP優化
- KMPKMP
- KMP模版KMP
- kmp——板子~~~KMP
- KMP模板KMP
- Analyzing Strings with sscanf
- POJ 3461 kmpKMP
- KMP&exKMPKMP
- 【字串匹配】KMP字串匹配KMP
- 專題十六 KMP & 擴充套件KMP & Manacher【Kuangbin】KMP套件
- KMP Algorithm 字串匹配演算法KMP小結KMPGo字串匹配演算法
- hihocoder 1015 KMP演算法 (KMP模板)KMP演算法
- ZOJ Martian Addition (20進位制的兩個大數相加)
- Add Strings 字串相加字串
- Encode and Decode Strings
- Leetcode Multiply StringsLeetCode
- Chapter 1 Arrays and Strings - 1.7APT
- Linux/AIX strings 命令LinuxAI
- Go Standard library - stringsGo
- KMP 自動機KMP
- JAVA KMP 純模板JavaKMP
- KMP演算法KMP演算法
- KMP 演算法KMP演算法
- golang中的strings.EqualFoldGolang
- Golang 常用的 strings 函式Golang函式
- Leetcode-Multiply StringsLeetCode
- Multiply Strings leetcode javaLeetCodeJava
- FZU 2275 Game (KMP)GAMKMP
- 藍橋複習——KMPKMP
- 演算法之KMP演算法KMP
- 第三週下 kmpKMP
- HDU 2594 (KMP入門)KMP
- [筆記](更新中)KMP筆記KMP