首页 > 其他 > 详细

湖大OJ-实验B----CFG是P成员

时间:2016-01-12 13:14:39      阅读:237      评论:0      收藏:0      [点我收藏+]
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;
}

  

湖大OJ-实验B----CFG是P成员

原文:http://www.cnblogs.com/pengfeiz/p/5123730.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!