终于用horspool算法把题目做出来了,可惜那个系统却说超时了,真想不能,有这么好的算法,还超时。

本文介绍了一个寻找字符串中特定模式的算法实现,并通过一个示例程序展示了如何计算一组数据中特定子串出现的位置,进而求得与该子串相关的数据总和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//最贵的贝壳
#include<iostream>
#include<fstream>
#include<cstring>
#define MAXN 1020
#define MAXM 120
using namespace std;
typedef struct
{
  int data[MAXN];
  char cs[MAXN];
}cost;
int *b_table(char pat[],int p_size)
{
static  int word_tab[130];
  int i_size=p_size;
  for(int i=0;i<128;i++)
    {
      word_tab[i]=p_size;
    }
  i_size--;
  for(int i=0;i!=p_size-1;i++)
    {
      word_tab[(int)pat[i]]=i_size;
      i_size--;
    }
  //  cout<<i_size<<endl;
  return word_tab;
}
void pipei(char text[],char pat[],int &count,int t_size,int p_size)
{
  //  int t_size=strlen(text);
  //  int p_size=strlen(pat);
  int i=p_size-1;
  //  cout<<i<<endl;
  int *table=b_table(pat,p_size);
  //  cout<<table[1]<<endl;
  int num[100];
  int j=0;
  while(i<t_size)//==
    {
      int mat_i=0;
      while(mat_i<p_size&&text[i-mat_i]==pat[p_size-mat_i-1])
    {
      mat_i++;
    }
      if(mat_i==p_size)
    {
      num[j]=i-p_size+1;
      //  cout<<num[j]<<" ";
      j++;
      i++;
    }
      else
    {
      i+=table[(int)text[i]];
    }
    }
  j--;
  count=num[j];

}

int main()
{

  //      char text[100]="12345566777891234123789 =789 23451234789 7899";
  //  char pat[10]={'7','8','9'};
  //ifstream cin("bei.in");
  int cot;
  char love[100];
  int n;
  cost cost;
  int sum=0;
  cin>>n;
  for(int i=0;i<n;i++)
    {
      cin>>cost.data[i];
    }

  for(int i=0;i<n;i++)
    {
      cin>>cost.cs[i];
    }
  //  cout<<cost.cs[0]<<endl;
  int m;
  cin>>m;

  int i;
  for( i=0;i<m;i++)
    {
      cin>>love[i];
    }
  //  cout<<m<<endl;
  //    int count=0;
  //  int c_len=strlen(cost.cs);
  //  int l_len=strlen(love);
  //  cout<<c_len<<endl<<l_len<<endl;
  //  cout<<n<<" "<<m<<endl;
  pipei(cost.cs,love,cot,n,m);//text,pat,count);//
  //  cout<<"|"<<cot<<endl;
        for(int i=0;i<m;i++)
      {
    sum+=cost.data[cot];
    cot++;
      }

    if(!cot)
      {
       return -1;
       cout<<"error"<<endl;
      }

    else
      {
    cout<<sum<<endl;//sum<<endl;
    return 0;
      }
}

 

 

 

bei.in:

23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
ILOVEUIDONOTLOVEUILOVEU
5
LOVEU

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值