NYOJ 336 子序列

子序列

时间限制: 2000 ms  |  内存限制: 65535 KB
难度: 4
描述

给定两个字符串序列A,B,求A序列不同位置构成的子序列中和B序列相同的有多少个。

例如A序列为a1b2c3d4c5(序列为abcc,12345是为区分位置而加入的数字),B序列abc

这A序列不同位置构成的子序列中和B相同的有a1b2c3,a1b2c5两个

 

输入
第一行一个数N(N不大于5)表示有N组测试数据
以下每组测试数据有两行 分别是字符串A和B,其中A串的长度不大于100000,B串的长度不多于1000,并且B长度多于100的只有一组数据
输出
对应每组数据输出一个整数,由于数字可能会很大,请对10003取余后再输出
样例输入
3
a
aa
abcbc
abc
abcdefabcdefdefa
a
样例输出
0
3
3
AC码:
#include<stdio.h>
#include<string.h>
char ch1[100005],ch2[1005];
int f[1005];
int main()
{
	int T,len1,len2,i,j;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s%s",ch1,ch2);
		len1=strlen(ch1);
		len2=strlen(ch2);
		memset(f,0,sizeof(f));
		if(len1<=len2)
		{
			if(strcmp(ch1,ch2)==0)
				printf("1\n");
			else
				printf("0\n");
		}
		else
		{
			f[0]=1;
			for(i=0;ch1[i]!='\0';i++)
			{
				for(j=len2-1;j>=0;j--)
				{
					if(j<=i&&ch1[i]==ch2[j])
						f[j+1]=(f[j]+f[j+1])%10003;
				}
			}
			printf("%d\n",f[len2]);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值