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 else 28 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 else 46 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 }
时间: 2024-10-10 14:42:05