Problem description |
上下文无关文法CFG G是否派生某个串W。采用动态规划(Dynamic Programming)设计一个一个多项式时间的验证算法。 实验方法: 编写一个算法/程序,对于给定的输入<g,w>,可以在多项式时间内判定ACFG。 实验结果: 交一个程序验证。 |
Input |
输入第一行为一个正整数n,接下来n行为一个满足乔姆斯基范式的文法描述。然后一个正整数m,接下来m行为m个小写字母组成的字符串(长度小于100) 表示m个待测试的串。 |
Output |
对于每一个测试串返回"yes"或者"no",表示该串是否能被文法派生出来。 |
Sample Input |
4 S->AB A->AB|a B->BC|b C->CA|CC|c 3 ab ac bc |
Sample Output |
yes no no |
代码如下:
#include<cstdlib> #include<iostream> #include<fstream> using namespace std; int main() { int n,m; while(cin>>n) { string *cfg; cfg=new string[n]; for(int i=0;i<n;i++) cin>>cfg[i]; cin>>m; string *str; str=new string[m]; for(int i=0;i<m;i++) cin>>str[i]; int *lstr; lstr=new int[m]; for(int i=0;i<m;i++) lstr[i]=str[i].length(); string ***table; table=new string**[m]; for(int i=0;i<m;i++) table[i]=new string*[lstr[i]]; for(int i=0;i<m;i++) for(int j=0;j<lstr[i];j++) table[i][j]=new string[lstr[i]]; string Ab[100]; int num=0; for(int i=0;i<n;i++) { for(int k=3;k<cfg[i].length();k++) { if(cfg[i][k]>96 && cfg[i][k]<123) { Ab[num]+=cfg[i][0]; Ab[num]+=cfg[i][k]; num++; } } } string ABC[100]; int num2=0; for(int i=0;i<n;i++) { for(int k=3;k<cfg[i].length();k++) { if(cfg[i][k]<91) { ABC[num2]+=cfg[i][0]; ABC[num2]+=cfg[i][k]; ABC[num2]+=cfg[i][k+1]; k++; num2++; } } } for(int i=0;i<m;i++) { for(int j=0;j<lstr[i];j++) { for(int k=0;k<num;k++) { if(str[i][j]==Ab[k][1]) table[i][j][j]=Ab[k][0]; } } } for(int i=0;i<m;i++) { for(int l=2;l<=lstr[i];l++) { for(int p=0;p<lstr[i]-l+1;p++) { int j=p+l-1; for(int k=p;k<j;k++) { for(int q=0;q<num2;q++) { if(table[i][p][k].find(ABC[q][1],0)!=string::npos && table[i][k+1][j].find(ABC[q][2],0)!=string::npos) { table[i][p][j]+=ABC[q][0]; } } } } } } for(int i=0;i<m;i++) { int flag=0; if(table[i][0][lstr[i]-1].find(cfg[0][0],0)!=string::npos) flag=1; if(flag==1) { cout<<"yes"<<endl; } else { cout<<"no"<<endl; } } delete []cfg; delete []str; for(int i=0;i<m;i++) for(int j=0;j<lstr[i];j++) delete []table[i][j]; for(int i=0;i<m;i++) delete []table[i]; delete []table; } return 0; }
原文:http://www.cnblogs.com/pengfeiz/p/5123730.html