题目链接

给一个字符串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 }

转载于:https://www.cnblogs.com/yohaha/p/5265964.html

codeforces 149E . Martian Strings kmp相关推荐

  1. E. Martian Strings (kmp)

    原题链接 思路: 和普通的匹配问题稍有不同的是本题匹配到的字符串在母串上可以不相连,但也不能相交. 主体思路不难想,考虑记录字符串的所有前缀匹配到的最小位置,记录字符串的所有后缀匹配到的最大位置,只要 ...

  2. Codeforces 149 E. Martian Strings

    正反两遍扩展KMP,维护公共长度为L时,出现在最左边和最右边的位置.... 然后枚举判断... E. Martian Strings time limit per test 2 seconds mem ...

  3. UVa455 Periodic Strings(kmp)

    先计算字符串的前缀函数,字符串长度为n,如果,说明字符串是周期的,否则不是. 代码参考: OJ/Periodic Strings(kmp).java at master · wuli2496/OJ · ...

  4. codeforces 616F Expensive Strings

    codeforces 616F Expensive Strings (广义后缀自动机) https://codeforces.com/contest/616/problem/F 题意: 给你n个字符串 ...

  5. CodeForces - 985F Isomorphic Strings

    假如两个区间的26的字母出现的位置集合分别是 A1,B1,A2,B2,....., 我们再能找到一个排列p[] 使得 A[i] = B[p[i]] ,那么就可以成功映射了. 显然集合可以直接hash, ...

  6. POJ 2406 Power Strings (KMP) kmp循环节

    版权声明:本文为博主原创文章,未经博主允许不得转载. Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions ...

  7. CodeForces - 1137B Camp Schedule(KMP的next数组+构造)

    题目链接:点击查看 题目大意:给出一个主字符串s,再给出一个子字符串ss,主串和子串都是只由0或1所组成的字符串,现在要求重组主串s,要求重组后的字符串: 所包含的0与1的个数与之前保持一致 尽可能多 ...

  8. [Educational Round 5][Codeforces 616F. Expensive Strings]

    这题调得我心疲力竭...Educational Round 5就过一段时间再发了_(:з」∠)_ 先后找了三份AC代码对拍,结果有两份都会在某些数据上出点问题...这场的数据有点水啊_(:з」∠)_[ ...

  9. codeforces 112APetya and Strings(字符串水题)

    A. Petya and Strings 点击打开题目 time limit per test 2 seconds memory limit per test 256 megabytes input ...

最新文章

  1. 常用 Git 命令清单
  2. mcs 4微型计算机,MCS-II高性能自主品牌的微机测速仪
  3. 第十六届全国大学智能车竞赛华南赛区成绩汇总
  4. 2021年春季学期-信号与系统-第十四次作业参考答案-第九小题参考答案
  5. Apache用户目录枚举工具apache-users
  6. throws和throw抛出异常的使用规则
  7. CF1146F: Leaf Partition(树形dp)
  8. Java中List、Map、Set三个接口,存取元素时,各有什么特点?
  9. SqoopFlume、Flume、HDFS之间比较
  10. 发布一个mmap的trie_midrmm02_新浪博客
  11. vs c语言程序调试方法,VS2015中的常用调试技巧分享
  12. ICollection IEnumerable/IEnumerator IDictionaryEnumerator yield
  13. 细说Linux链接文件类型
  14. IK Multimedia MODO BASS for mac(低音效果虚拟乐器)
  15. 手机号码正则_中国大陆手机号码的正则表达式总结ChinaMobilePhoneNumberRegex
  16. bin是什么文件,要如何打开?
  17. Apache Curator操作zookeeper的API使用
  18. HTML5排序罗马数字,HTML5 罗马数字时钟
  19. Android HorizontalScrollView左右滑动
  20. 记阿里UC跟cvte社招面试-----都挂了~

热门文章

  1. 日本媒体称东芝敲定收购富士通硬盘业务
  2. 基于Teigha.Net实现CAD到SHP的转换方案
  3. IClient for js开发之地图的加载
  4. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
  5. 对No Starch Press出版的《Python Playground》一书的书评及其作者访谈录
  6. Centos6.4下zabbix的安装配置
  7. 【编程好习惯】通过命名规则区分变量
  8. 初探webpack之编写plugin
  9. 手写bind_一次搞定前端“四大手写”
  10. dreamweaver开源_Dreamweaver的7种开源替代品