C- 字符串匹配

该程序处理一系列字符串操作,包括添加、查询最长公共子串和删除字符。对于每个查询操作,它计算并输出两个字符串的最长公共连续子串的长度。样例中展示了如何在不同操作后找到字符串的最长公共子串。

题目描述

有若干字符串,依次进行如下操作:
对一个字符串buf, 初始长度 <= 10, 我们对其有以下三种操作:
· 操作1的格式为"1_a", 表示在字符串buf末尾添加字符串a. (a的长度<= 100)
· 操作2的格式为"2_b",表示查询字符串b与字符串buf的最长连续公共子串的长度。(b的长度<=100)
· 操作3的格式为"3_len", 表示删除字符串buf末尾 len 个字符. 保证len 小于等于字符串buf的长度。
 
对buf进行m <= 10000次操作。对于每个操作2, 输出最长公共连续最长字串长度。
注意,每次操作之后的所有buf串平均长度约为10。
 

输入

有1组或多组数据(最多约10组数据),每组数据格式如下:

第一行一个字符串buf。(由小写字母构成,长度小于10)

第二行一个整数 m,表示有m个操作。接下来m行每行一个操作
 

输出


对于每个2操作, 输出ans

样例输入

abcd
7
2 cde
1 e
2 cde
3 3
2 abc
1 c
2 abc

样例输出

2
3
2
3
#include<stdio.h>
#include<string.h>
int match(char a[], char b[])//暴力匹配
{
    int i, j, k;
    int max = 0;
    for (i = 0; i < strlen(a); i++)
    {
        for (j = 0; j < strlen(b); j++)
        {
            for (k = 0; a[i + k] == b[j + k]; k++)
            {
                if (a[i + k] == '\0')
                {
                    break;
                }
            }
            if (k > max)
            {
                max = k;
            }
        }
    }
    return max;

}
int main()
{
    char a[1000010] = { 0 }, b[1000] = { 0 };
    int i, j;
    int n, op, len;//分别表示输入几个指令;操作码;操作3中的删除几个字符
    int la, lb;//字符长度
    while (scanf("%s", &a) != EOF)
    {
        scanf("%d", &n);
        for (i = 0; i < n; i++)
        {
            scanf("%d", &op);
            if (op == 1)
            {
                scanf("%s", &b);
                la = strlen(a);
                lb = strlen(b);
                for (j = 0; j < lb; j++)
                {
                    a[la + j] = b[j];
                }
                a[la + j] = '\0';
                b[0] = '\0';
            }
            if (op == 2)
            {
                scanf("%s", &b);
                printf("%d\n", match(a, b));
                b[0] = '\0';
            }

            if (op == 3)
            {
                scanf("%d", &len);
                la = strlen(a);
                a[la - len] = '\0';
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值