ZOJ3643
来源:互联网 发布:Matlab中矩阵旋转 编辑:程序博客网 时间:2024/06/10 07:03
传送门:ZOJ3643
很有意思的KMP。
kmp就不说啥了。
这道题的瓶颈在于暴力删除会超时,于是我们观察注意到[l,r]被删除之后,造成的影响仅仅是下一次我们会从l-1开始匹配。
然后就可以乱搞了……
栈里面存的是母串在子串中匹配到的位置。
代码上的小细节见下。
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <algorithm>#include <iostream>#include <stack>using namespace std;stack<int> Q;int ans;int pre[1000005];char P[1000005];char T[1000005];void Make_Table(char* S,int* pre){ int len=strlen(S+1); pre[1]=0;int k=0; for(int i=2;i<=len;i++){ while(k&&S[k+1]!=S[i]) k=pre[k]; if(S[k+1]==S[i]) k++; pre[i]=k; }}void GetAns(char* P,char* T){ Q.push(0);int j=0,len1=strlen(P+1),len2=strlen(T+1); ans=0; for(int i=1;i<=len1;i++){ while(j&&T[j+1]!=P[i]) j=pre[j]; if(T[j+1]==P[i]) j++; Q.push(j); if(j==len2){ ans++; for(int i=1;i<=len2;i++) Q.pop(); j=Q.empty()?0:Q.top(); } } printf("%d\n",ans);}void Solve(){ freopen("loli.in","r",stdin); while(~scanf("%s%s",T+1,P+1)){ Make_Table(T,pre); GetAns(P,T); }}void Close(){ fclose(stdin); fclose(stdout);}int main(){ Solve(); Close(); return 0;}
0 0
- ZOJ3643
- ZOJ3643 Keep Deleting
- BLToolkit Output Parameter in DataAccessor
- 在Swift怎样创建CocoaPod?
- QT5.4中MySQL5.6驱动配置
- Java发送邮件
- mysql 按月/按周汇总统计函数 DATE_FORMAT() 函数
- ZOJ3643
- 初学Java 配置jdk
- mac下eclipse开发环境搭建
- 图结构练习——BFSDFS——判断可达性
- Qt把double类型的时间转化为QDateTime类型
- FastDfs+nginx环境配置
- 7-使用MATLAB进行编程
- softmax回归
- spring+Quartz定时器