欧卡2中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

需要三步,才能开始

只需两步,慢速开始

欧卡2入门方向盘选莱仕达V9莱仕达折叠便携游戏方向盘支架欢迎地图Mod入驻
查看: 5919|回复: 0
收起左侧

[编程] CFG是P成员

[复制链接]
2012 发表于 2015-1-6 22:43 | 显示全部楼层 |阅读模式
#include<iostream>
using namespace std;
int main()
{
    int n,m;     //n行满足乔姆斯基范式的文法描述, m行待测字符串
 while(cin>>n)
 {
  string *cfg;   //CFG文法描述
  cfg=new string[n];
  for(int i=0;i<n;i++)
   cin>>cfg[i];  //输入CFG文法
  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]];
  
  
  //找出所有A->b型规则
  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++;
    }
   }
  }
  //找出所有A->BC型规则
  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++;
    }
   }
  }
  //考察每一个长为1的子串
  for(int i=0;i<m;i++)
  {
   for(int j=0;j<lstr[i];j++)  //考察每一个长为1的子串
   {
    for(int k=0;k<num;k++)
    {
     if(str[i][j]==Ab[k][1])  //考察CFG文法的每一个字符
      table[i][j][j]=Ab[k][0];
    }    
   }
  }
  
  //考察l长度的子串
  for(int i=0;i<m;i++)
  {
   for(int l=2;l<=lstr[i];l++)  //l是子串的长度
   {
    for(int p=0;p<lstr[i]-l+1;p++) //p是子串的起始位置
    {
     int j=p+l-1;    //j是子串的结束位置
     for(int k=p;k<j;k++)  //k是分裂的位置 k<=j-1 ->k<j
     {
      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];
       }
      }
     }
    }
   }
  }
  //检查起始变元是否在table[0][n]中
  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;
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们|手机版|欧卡2中国 ( 湘ICP备11020288号-1 )

GMT+8, 2024-5-3 08:01 , Processed in 0.037250 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表