计算理论第二个实验,比第一个复杂,本机测试通过,可是ACM上总是说我的结果是错误的。郁闷中..
算法是动态规划,按照书上的伪码描述写出代码,不过还不理解为什么算法可行。关于伪码描述,可以在这里查看:CFG是P成员。
Problem description
上下文无关文法CFG G是否派生某个串W。采用动态规划(Dynamic Programming)设计一个一个多项式时间的验证算法。 实验方法: 编写一个算法/程序,对于给定的输入,可以在多项式时间内判定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
本机测试结果
data.txt内容:
3
S->RT
R->TR|a
T->TR|b
3
baba
ababb
bbab
table.html内容:
3 行CFG文法规则如下:
S->RT
R->TR|a
T->TR|b
3 个待测字符串为:
baba 长度 = 4
ababb 长度 = 5
bbab 长度 = 4
串baba表格为:
T | RT | S | SRT |
R | S | S | |
T | RT | ||
R |
串ababb表格为:
R | S | S | ||
T | RT | S | ||
R | S | |||
T | ||||
T |
串bbab表格为:
T | RT | S | |
T | RT | S | |
R | S | ||
T |
串 baba 接受状态: yes!
串 ababb 接受状态: no!
串 bbab 接受状态: yes!
31日更新
貌似是改了测试数据,有人ac了,不过我的代码却报超时。将内层循环移到外面之后,总算ac了。
下面是本机测试代码,稍加删除修改后即可提交。
#include
#include
#include
using namespace std;
int main()
{
ifstream fin;
ofstream out;
fin.open("data.txt");
int n,m; //n行满足乔姆斯基范式的文法描述, m行待测字符串
//while(cin>>n)
//{
fin>>n;
string *cfg; //CFG文法描述
cfg=new string[n];
for(int i=0;i>cfg[i]; //输入CFG文法
fin>>m; //输入待测字符串数量
string *str; //待测字符串
str=new string[m];
for(int i=0;i>str[i]; //输入待测字符串
int *lstr; //待测字符串的长度
lstr=new int[m];
for(int i=0;i\ntable tr td {border: 1px solid blue; text-align: center;}\n\n";
out<<"
"< ";
for(int i=0;i ";
out<<"
"< ";
for(int i=0;i ";
out.close();
//找出所有A->b型规则
string Ab[100];
int num=0;
for(int i=0;i96 && cfg[i][k]<123)
{
Ab[num]+=cfg[i][0];
Ab[num]+=cfg[i][k];
num++;
}
}
}
cout<<"所有的A->b型规则为:"<"<BC型规则
string ABC[100];
int num2=0;
for(int i=0;iBC型规则为:"<"<k2;c--) //考察CFG文法的每一个字符
{
if(table[i][p][k].find(cfg[kr][c-1],0)!=string::npos && table[i][k+1][j].find(cfg[kr][c],0)!=string::npos)
{
out.open("gc.txt",ios::app);
table[i][p][j]+=cfg[kr][0];
out<<"table["<串"<"<"<"<";
}
out<<""<
"<串 "<yes!
"<串 "<no!
"<
One thought on “计算理论实验--CFG是P成员”
发表回复
亲 能不能给出你的AC代码~实在是好难改啊