【背景】
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); } }