首页 > 代码库 > NYOJ 336 子序列

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;
}