题目描述
有若干字符串,依次进行如下操作:
对一个字符串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 版权协议,转载请附上原文出处链接和本声明。