zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    android之APN
    Simple XML
    Retrofit – Java(Android) 的REST 接口封装类库
    Android 删除短信
    解决android:background背景图片被拉伸问题
    人分三等,你是哪一等?
    将android中的sample例子到eclipse中
    linux内存管理
    Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚(转)
    使用maven创建web项目
  • 原文地址:https://www.cnblogs.com/yohaha/p/5265964.html
Copyright © 2011-2022 走看看