现在的位置: 首页 > 综合 > 正文

1381 包饺子

2013年01月12日 ⁄ 综合 ⁄ 共 1259字 ⁄ 字号 评论关闭
 
描述

【背景】

2008.11.16

3721大班在Mr Lv 的组织下,到六食堂举办了一次集体包饺子活动:)

这次活动很成功,大家都很高兴,所谓“有缘千里,相聚北航”。

下来后,某人根据这次活动出了一套练习题……

------------------------------------------------

本次包饺子活动的重头戏之一:各个小班之间竞争包饺子,在限定时间内看谁包饺子多……

问题是,每个小组中还有捣乱的存在(当然是安排的其他小班的)……

假设制作饺子的流程是:

拿皮->放馅->封口->放饺子->拿皮->…这样的一个序列;

这样一个合法的序列就可以表示成为一个字符串:

abcdabcdabcd…

某个小组的捣乱的干的一个事情是:

把某些子串翻转,也就是假设原来串是abcdabcd,捣蛋者从第3个位置开始连续3个操作翻转,就成为了abadcbcd。这样的影响是什么呢?

当然某些饺子就无法完工了,因为必须一个完整的abcd才算一个饺子完工;

不过捣乱时间比较短,所以有时候翻转后反而把以前捣乱成果破环也有可能……

现在的任务是,知道原始序列,长度为n的一个字符串,这个字符串的顺序肯定是abcd的循环,但结束时候不一定是一个完整的abcd,也就是说可能时间到时候最后那个饺子还没有完工,比如abcdab表示第一个饺子完工了,第二个饺子正在放陷。

又知道捣乱者做了m次操作,每次都是从ai位置开始的连续3个操作字符翻转;

评委想知道究竟这个小组做了多少个饺子;

计数规则是:从第一个操作字符开始扫描,每扫描到一个完整的abcd算作一个饺子;

输入

第一行包含一个整数T,表示有T组数据;

以下每组数据结构:

第一行为两个整数N,M,分别表示操作序列有N,捣乱次数为M;

第二行为一个长度为N的字符串,为abcd的循环;

第三行为M个正整数,表示第i次捣乱的起始位置,保证合法(不会出现+3个字符后超过N)

保证N小于1000,M小于50;

输出

对于每组数据输出一行,包含一个整数表示最后成功制作出的饺子的数目;

样例输入
1
16 3
abcdabcdabcdabcd
2 3 5
样例输出
2

 

 

模拟题

#include <stdio.h>
main()
{
	int number,te;
	int n,m,count;
	char a[1000];
	int i,j;
	int up;
	char temp1,temp2;
	scanf("%d",&number);
	for(te=1;te<=number;te++)
	{  count=0;
		scanf("%d %d",&n,&m);
		getchar();
		scanf("%s",&a);
		for(i=0;i<m;i++)
		{
			scanf("%d",&up);

			temp1=a[up-1];
		
			temp2=a[up+1];
			a[up-1]=temp2;
			a[up+1]=temp1;
			
		}
		for(i=0;i<=n-4;i++)
		{
			if(a[i]=='a'&&a[i+1]=='b'&&a[i+2]=='c'&&a[i+3]=='d')
				count++;
		}
		printf("%d\n",count);

	}
}

 

抱歉!评论已关闭.