首页 > 代码库 > HDU 5763 Another Meaning(DP+KMP)
HDU 5763 Another Meaning(DP+KMP)
http://acm.hdu.edu.cn/showproblem.php?pid=5763
题意:
给出一个字符串和一个模式串,模式串有两种意思,问这句话有几种意思。
思路:
因为肯定要去字符串去找模式串,所以首先用KMP计算next数组,然后用动态规划,d[i]表示分析到第i个字符时有多少种意思。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map>10 using namespace std;11 12 const int maxn=1e5;13 const int MOD=1000000007;14 15 char a[maxn],b[maxn];16 int _next[maxn];17 int d[maxn];18 19 void get_next()20 {21 int i=-1,j=0;22 _next[0]=-1;23 while(j<strlen(b))24 {25 if(i==-1||b[i]==b[j])26 _next[++j]=++i;27 else28 i=_next[i];29 }30 }31 32 int KMP(int n,int m)33 {34 int i, j;35 i = j = 0;36 while (i<n)37 {38 if (j == -1 || a[i] == b[j])39 {40 if(i>0) d[i]=d[i-1];41 i++;42 j++;43 if (j == m) d[i-1]=(d[i-1-(j-1-_next[j-1])]+d[i-1-m]+1)%MOD;44 }45 else46 j = _next[j];47 }48 }49 50 51 int main()52 {53 //freopen("D:\\input.txt","r",stdin);54 int T;55 scanf("%d",&T);56 for(int kase=1;kase<=T;kase++)57 {58 scanf("%s",&a);59 scanf("%s",&b);60 int n=strlen(a); int m=strlen(b);61 memset(d,0,sizeof(d));62 get_next();63 KMP(n,m);64 printf("Case #%d: ",kase);65 printf("%d\n",d[n-1]+1);66 }67 return 0;68 }
HDU 5763 Another Meaning(DP+KMP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。