UESTC 1091秋实大哥の恋爱物语 【简单KMP】
2017-03-21 17:12
381 查看
【解题思路】
此题首先容易看出是KMP算法,唯一的难点在于上下平移。
我们很容易证明对于两个串A,B,如果B能够在A中匹配x次(可以上下平移),那么A和B中每一个数减去前一个数的差组成的新串匹配次数一样。
例如:
A:1 2 3 1 2 3
B:1 2
匹配次数:4
做差之后->
A:1 1 -2 1 1
B:1
匹配次数:4
所以只需要预处理一下,将模式串和匹配串都做差处理即可。
【代码】:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<ctime> #include<cmath> #include<iomanip> #define LL long long #define LOCAL using namespace std; const int N=2000005; int T ,P ,F ; int posm,posn; int cnt=0; void Fail(int *P,int *F){ F[0]=F[1]=0; for (int i=1;i<posm;++i){ int j=F[i]; while (j&&P[i]!=P[j]) j=F[j]; F[i+1]=(P[i]==P[j]) ? j+1 : 0; } } void KMP(int *T,int *P,int *F){ Fail(P,F); int j=0; for (int i=0;i<posn;++i){ while (j&&T[i]!=P[j]) j=F[j]; if (P[j]==T[i]) j++; if (j==posm){ cnt++; if (cnt==1) printf("Wow! Life Winner!\n"); j=F[j]; } } } int main(){ #ifdef LOCAL freopen("UESTC1091.in","r",stdin); #endif scanf("%d",&posn); for (int i=0;i<posn;++i) scanf("%d",&T[i]); for (int i=0;i<posn-1;++i) T[i]=T[i+1]-T[i]; T[posn-1]=0; posn--; scanf("%d",&posm); for (int i=0;i<posm;++i) scanf("%d",&P[i]); for (int i=0;i<posm-1;++i) P[i]=P[i+1]-P[i]; P[posm-1]=0; posm--; KMP(T,P,F); if (cnt!=0) printf("%d\n",cnt); else printf("Oh. That's impossible. I must have had a dream.\n"); return 0;
}
【总结】:KMP+简单处理
相关文章推荐
- CDOJ 1091 秋实大哥の恋爱物语 KMP
- 2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
- UESTC 1091秋实大哥の恋爱物语 [偏移模式匹配]
- UESTC 1091 秋实大哥の恋爱物语
- 2015 UESTC 搜索专题J题 全都是秋实大哥 kmp
- cdoj1091-秋实大哥の恋爱物语 【kmp】
- UESTC 1065 全都是秋实大哥 kmp
- 2015 UESTC Training for Search Algorithm & String - J - 全都是秋实大哥 【KMP】
- UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>
- UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures<Problem F>
- uestc data structure training f 秋实大哥与妹纸
- uestc data structure n 秋实大哥搞算数
- 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
- UESTC_全都是秋实大哥 2015 UESTC Training for Search Algorithm & String<Problem J>
- UESTC_秋实大哥与家 2015 UESTC Training for Data Structures<Problem E>
- 2015 UESTC 数据结构专题D题 秋实大哥与战争 SET的妙用
- UESTC_秋实大哥打游戏 2015 UESTC Training for Data Structures<Problem H>
- 2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
- UESTC_秋实大哥去打工 2015 UESTC Training for Data Structures<Problem G>
- 2015 UESTC 数据结构专题D题 秋实大哥与战争 变化版本的线段树,合并区间,单点查询