[JZOJ4624] 字符串匹配
来源:互联网 发布:python beaker 编辑:程序博客网 时间:2024/04/30 18:55
Description
给两个字符串
Solution
咦,这不就
先把
然后再整个复制一遍把中间的部分跑
然后除一下弄起来就好了。边上的细节要自己多想想(这是经典问题了,真的很水)
Code
#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)using namespace std;char s[100005],t[400005];int p[100005],n,m,ans,ans1;long long cf,cs;long long kmp(int x,int y){ int i,j=0; long long ans=0; fo(i,x,y) { while (j>0&&s[j+1]!=t[i]) j=p[j]; if (s[j+1]==t[i]) j++; if (j==n) { ans++; j=p[j]; } } return ans;}void copy(){ int i; fo(i,1,m) t[i+cs*m]=t[i]; cs++;}void copy1(){ int i; fo(i,1,cs*m) t[i+cs*m]=t[i]; cs*=2;}int main(){ freopen("strmatch.in","r",stdin); freopen("strmatch.out","w",stdout); cin>>cf; scanf("\n"); scanf("%s",s+1); scanf("\n"); scanf("%s",t+1); n=strlen(s+1); m=strlen(t+1); int i,j=0; p[1]=0; cs=1; fo(i,2,n) { while (j>0&&s[j+1]!=s[i]) j=p[j]; if (s[j+1]==s[i]) j++; p[i]=j; } if (cf*(long long)m<=3*n) { while (cs<cf) copy(); ans=kmp(1,cf*m); cout<<ans; return 0; } while (cs*m<n) copy(); ans=kmp(1,cs*m); copy1(); ans1=kmp(cs*m/2-n+2,cs*m/2+n-1); cs/=2; long long s1=(cf/cs)*ans+(cf/cs-1)*ans1; cout<<s1+(cf%cs==1)*ans; }
0 0
- [JZOJ4624] 字符串匹配
- 【JZOJ4624】字符串匹配
- 【jzoj4624】【字符串匹配】【kmp】
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配...
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 字符串匹配
- 深入浅出RxJava就这一篇就够了
- Cordova 混合应用处理输入法相关事件
- 非构造函数的继承 深拷贝
- 同一个textview设置不同文字样式
- MySQL:常用函数
- [JZOJ4624] 字符串匹配
- 安装spark,基于hadoop的
- Android使用Glide加载Gif.解决Glide加载Gif非常慢问题
- java学习基础篇(十)单例设计模式
- Linux上的一些积累
- SSM框架整合(下篇)
- leetcode算法题总结之Reverse String
- ArcGIS教程:什么是格网和经纬网?
- c++11:正则表达式(re)