codeforces 149E . Martian Strings kmp
给一个字符串s, n个字符串str。 令tmp为s中不重叠的两个连续子串合起来的结果, 顺序不能改变。问tmp能形成n个字符串中的几个。
初始将一个数组dp赋值为-1。
对str做kmp, 然后与串s进行匹配, 看哪些长度的串可以匹配到, 比如说匹配到了长度为j的串, 那么dp[j] = i, i是此时串s的位置。 然后将s和str都反转, 在做一次kmp, 在进行匹配, 对于匹配到的长度j, 看dp[lenStr-j]是否为-1, 如果不为-1, 看lenS-i是否大于等于dp[lenStr-j], 意思是这一部分在之前那一部分的右边。
语言表达能力好差................................感觉根本没有说清.还是看代码
1 #include <iostream> 2 #include <vector> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 #include <map> 8 #include <set> 9 #include <string> 10 #include <queue> 11 #include <stack> 12 #include <bitset> 13 using namespace std; 14 #define pb(x) push_back(x) 15 #define ll long long 16 #define mk(x, y) make_pair(x, y) 17 #define lson l, m, rt<<1 18 #define mem(a) memset(a, 0, sizeof(a)) 19 #define rson m+1, r, rt<<1|1 20 #define mem1(a) memset(a, -1, sizeof(a)) 21 #define mem2(a) memset(a, 0x3f, sizeof(a)) 22 #define rep(i, n, a) for(int i = a; i<n; i++) 23 #define fi first 24 #define se second 25 typedef pair<int, int> pll; 26 const double PI = acos(-1.0); 27 const double eps = 1e-8; 28 const int mod = 1e9+7; 29 const int inf = 1061109567; 30 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; 31 string s, str; 32 int nextt[1005], dp[100005]; 33 void initKmp() { 34 nextt[0] = -1; 35 int i = 0, j = -1, len = str.size(); 36 while(i<len) { 37 if(j==-1||str[i]==str[j]) 38 nextt[++i] = ++j; 39 else 40 j = nextt[j]; 41 } 42 } 43 int solve() { 44 cin>>str; 45 if(str.size()<=1) 46 return 0; 47 initKmp(); 48 mem1(dp); 49 int i = 0, j = 0, len1 = s.size(), len2 = str.size(); 50 while(i<len1) { 51 if(j==-1||s[i]==str[j]) { 52 i++, j++; 53 } else { 54 j = nextt[j]; 55 } 56 if(j == len2) 57 return 1; 58 if(j>=0&&dp[j]==-1) 59 dp[j] = i; 60 } 61 reverse(s.begin(), s.end()); 62 reverse(str.begin(), str.end()); 63 initKmp(); 64 i = 0, j = 0; 65 while(i<len1) { 66 if(j == -1 || s[i]==str[j]) { 67 i++, j++; 68 } else { 69 j = nextt[j]; 70 } 71 if(j>=0&&dp[len2-j]!=-1 && dp[len2-j]<=len1-i) { 72 reverse(s.begin(), s.end()); 73 return 1; 74 } 75 } 76 reverse(s.begin(), s.end()); 77 return 0; 78 } 79 int main() 80 { 81 cin>>s; 82 int n, ans = 0; 83 cin>>n; 84 for(int i = 0; i<n; i++) { 85 ans += solve(); 86 } 87 cout<<ans<<endl; 88 return 0; 89 }