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 }

 

posted on 2016-03-11 15:36  yohaha  阅读(238)  评论(0编辑  收藏  举报

导航