csu1328模拟

本文介绍了一种基于字符串匹配的算法,该算法通过比较两个字符串来找出最长的相同子串,并记录其起始位置。通过对输入字符串进行预处理,提取字母字符并转换为小写,以减少不必要的比较。该算法使用两种不同的工作模式来进行比较,适用于需要寻找特定子串的应用场景。

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

题目链接:点击打开链接

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=1e3+10;
char s[maxn],sub[maxn];
int p[maxn],len;
int Max,pos,cunt,n;
void work(int k1,int k2)
{
    int i,j,cost;
    cost=0;
for(i=k1,j=k2;i>=0&&j<cunt;i--,j++)
{
    if(sub[i]!=sub[j])cost++;
    if(cost>n)break;
}
i++,j--;
if(i>j)return ;
int Maxlen=p[j]-p[i]+1;
//printf("k1=%d k2=%d i=%d j=%d %d\n",k1,k2,i,j,Maxlen);
if(Maxlen>Max)
{
    Max=Maxlen;
    pos=p[i];
}
}
int main()
{
    int i,j,k;
    int ans=0;
    while(~scanf("%d\n",&n))
    {
        Max=0,pos=0;
        gets(s);
  len=strlen(s);
 // printf("len=%d\n",len);
        cunt=0;
        for(i=0;i<len;i++)
        {
          if(isalpha(s[i]))
          {
          sub[cunt]=tolower(s[i]);
          p[cunt++]=i;
          }

        }
        sub[cunt]='\0';
    // puts(sub);
       // printf("cunt=%d\n",cunt);
        for(i=0;i<cunt;i++)
        {
            work(i,i);
            work(i,i+1);
        }
        printf("Case %d: %d %d\n",++ans,Max,pos+1);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值