ACM 90. 翻译玛雅著作(改版字符串O(n)匹配,尺取法)

90. 翻译玛雅著作

★☆   输入文件: writing.in   输出文件: writing.out    简单对比
时间限制:3 s   内存限制:128 MB

[问题描述]

    初期研究证实解读玛雅文是一项比预期复杂的任务,即使在过了两百年以后,也只有很少的内容能被人们真正理解,其实也仅是在最近的三十年人们才真正地对它展开研究。 
玛雅文是基于石刻的一些被认为是象形符号的表征声音的小图画,通常把一些象形符号放在不同的位置就组合成了一个玛雅文中的词。 
    解读玛雅文时遇到的问题之一是在读的顺序上,在摆放几个符号以拼写成一个词的时候,玛雅文创作者有时按他们的主观感觉来决定符号的摆放位置,而不是按照任何特殊规则。这导致的问题是,尽管知道了许多符号的发音,但是考古学家们有时仍旧不能确定一个词的读法。 
    考古学家正在寻找一个特殊的词w,他们知道组成它的各个符号,但是他们不知道所有这些符号的可能排列方法。后来他们听说你来了,就想求得你的帮助。他们将给你提供g个组成词w的符号,同时还有一个符号串s,里面包含了他们在研究石刻时发现的所有符号。请帮助他们计算一下词w有多少种可能的拼写方案。

任务: 
    写一个程序,给定组成w的符号和石刻中的符号串s,计算s中w的可能拼写方案出现的次数;确切点说,s中每一个连续的长度为g的符号串都可能是w中那些符号的一个排列。

约束条件: 
1 ≤ g ≤ 3 000 w中的符号个数; 
g ≤ |s| ≤ 3 000 000 |s|是s中符号的个数。

[输 入] : 

第一行包含两个整数:g和|s|,空格隔开; 
第二行包含g个连续的字符,分别表示组成w的g个符号,字符有效范围为'a'-'z'和'A'-'Z',大小写字母有区别; 
第三行包含|s|个连续的字符,表示石刻中的符号,字符有效范围为'a'-'z'和'A'-'Z',大小写字母有区别。

[输 出] : 
只有一行,即s中w的可能拼写方案出现的次数。

[输入输出样例] 
writing.in

4 11 
cAda 
AbrAcadAbRa 

writing.out: 

2

等级: 
其中有50分的测试数据g≤ 1000。 
对使用Pascal语言的选手的重要提醒: 
FreePascal中默认字符串类型变量长度不能超过255个字符.


记录要寻找的串中字母需要的个数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

char strFind[3010];
char str[3000001];
char c[3010];

int m,n;
int match;
bool used[256];
int need[256];
int maxneed[256];


int main()
{
	freopen("writing.in","r",stdin);
	freopen("writing.out","w",stdout);

	cin>>m>>n;
	cin>>strFind>>str;

	int cnt=0;
	match=0;

	for(int i=0;i<m;i++)
	{
		maxneed[strFind[i]]++;
		used[strFind[i]]=true;
	}
	match=0;
	for(int i=0;i<n;i++)
	{
		if(used[str[i]])
		{
			need[str[i]]++;
			if(need[str[i]]<=maxneed[str[i]])
				match++;
		}
		if(match==m)
		{
			cnt++;
		}
		if(i>=m-1)
		{
			if(used[str[i-m+1]])
			{
				need[str[i-m+1]]--;
				if(need[str[i-m+1]]<maxneed[str[i-m+1]])
					match--;
			}
		}
	}

	cout<<cnt<<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值