CF149E Martian Strings 题解
题意
给定一个主串
考虑如何拼接
Code:
#include<bits/stdc++.h> using namespace std; const int N = 1e5+100; char b[N], s[N]; int n, m, lth; int fnxt[N], bnxt[N], posl[1005], posr[1005]; bool KMP(){ int j = 0; for(int i = 2; i<=lth; i++){ while(j && b[j+1]!=b[i]){ j = fnxt[j]; } if(b[j+1]==b[i]){ j++; } fnxt[i] = j; } j = lth+1;bnxt[lth] = lth+1; for(int i = lth-1; i>=1; i--){ while(j<=lth&&b[j-1]!=b[i]){ j = bnxt[j]; } if(b[j-1]==b[i]){//只记录第一次出现的结束位置 j--; } bnxt[i] = j; } memset(posl, 0, sizeof(posl)); j = 0; for(int i = 1; i<=n; i++){ while(j && s[i]!=b[j+1]){ j = fnxt[j]; } if(s[i]==b[j+1]){ j++; } if(!posl[j]&&j){ posl[j] = i; } } j = lth+1; for(int i = n; i>=1; i--){ while(j<=lth&&b[j-1]!=s[i]){ j = bnxt[j]; } if(s[i]==b[j-1]){ j--; } if((j-1)&&posl[j-1]&&posl[j-1]<i&&(j<=lth)){//注意前后缀都要非空 return true; } } return false; } int ans; int main(){ scanf("%s", s+1); n = strlen(s+1); scanf("%d", &m); while(m--){ scanf("%s", b+1); lth = strlen(b+1); if(KMP()){ ans++; } } printf("%d\n", ans); system("pause"); return 0; }