C- 字符串匹配

  • Post author:
  • Post category:其他


题目描述

有若干字符串,依次进行如下操作:

对一个字符串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;
}



版权声明:本文为live_z原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。