2017计蒜客第一场B题-阿里天池的新任务(简单)(数据结构-KMP)
2017-05-20 21:34
381 查看
2017计蒜客第一场B题-阿里天池的新任务(简单)KMP子串匹配个数
题面链接题意
给出一定的规则找出长串s,已知短串s1,求s1在长串s中出现的次数
KMP
一个效率非常高的字符串匹配算法。
KMP是o(n+m)的算法
#include<bits/stdc++.h> using namespace std; typedef long long LL; int n,a,b,l,r,i,j; char s[1000010],s1[1000010];///s为长串,s1为短串 int f[1000010]; int w[1000010]; ///KMP算法求最大匹配子串个数 void getf(char s1[]) { memset(f,0,sizeof(f)); int len=strlen(s1); for(i=1;i<len;i++) { int j=f[i]; while(j&&s1[i]!=s1[j]) j=f[j]; f[i+1]=(s1[i]==s1[j])?j+1:0; } } int find(char s[],char s1[]) { int ans=0; getf(s1); j=0; int len=strlen(s1); for(i=0;i<n;i++) { while(j&&s[i]!=s1[j]) j=f[j]; if(s[i]==s1[j]) j++; if(j==len) { ans++; } } return ans; } int main() { scanf("%d%d%d%d%d",&n,&a,&b,&l,&r); scanf("%s",s1); for(i=0;i<n;i++) { if(i==0) w[i]=b; else w[i]=(w[i-1]+a)%n; if(w[i]>=l&&w[i]<=r&&(w[i]%2==0)) s[i]='A'; if(w[i]>=l&&w[i]<=r&&w[i]%2==1) s[i]='T'; if((w[i]<l||w[i]>r)&&w[i]%2==0) s[i]='G'; if((w[i]<l||w[i]>r)&&w[i]%2==1) s[i]='C'; }///按照规则得出这个s串 s ='\0';///结束这个串 int ans=find(s,s1); printf("%d\n",ans); return 0; }
相关文章推荐
- 阿里天池的新任务(简单)(KMP统计子串出现的次数)
- 2017 计蒜之道 初赛 第一场 阿里天池的新任务(简单)(KMP)
- 计蒜之道初赛第一场-阿里天池的新任务(简单)
- 阿里天池的新任务(简单)【字符串匹配哈希算法】 计蒜客初赛第一场
- 阿里天池的新任务(简单)KMP,看样子网上有bug的kmp算法还是有蛮多
- 2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)
- 计蒜客 阿里天池的新任务(简单)KMP轻松水过
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- HDU 1867 A + B for you again 数据结构+KMP简单应用
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜之道 初赛第一场B 阿里天池的新任务(简单)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜客-阿里天池的新任务(kmp求字符串出现的次数)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)
- 计蒜客 2017 初赛第一场 B. 阿里天池的新任务(简单)