题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5311
思路分析:该问题要求在字符串中是否存在三个不相交的子串s[l1..r1], s[l2..r2], s[l3..r3]能够拼接成模式串,而且满足要求1≤l1≤r1<l2≤r2<l3≤r3≤n;
由于数据较小,可见将模式串拆分为所有的三个不想交的子串的所有可能,再使用KMP算法求在字符串中是否存在这三个子串且满足顺序要求即可;
代码如下:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAX_N = 200 + 10; int Next[MAX_N]; const char *str = "anniversary"; char pat[MAX_N], pat_sub[MAX_N]; char sub_1[MAX_N], sub_2[MAX_N], sub_3[MAX_N]; void get_nextval(char *W, int Next[]) { int i = 0, j = -1; int Len_W = strlen(W); Next[0] = -1; if (W[0] == '