问题描述
小张的好朋友小松要过生日了,小张打算为他挑选一件礼物。在市场上他发现有一个珠子手镯的商店很不错。在这家商店会出售特殊的珠子并穿成一个手镯,在货架上珠子排成一排,每一个珠子上有一个小写英文字母。店家有一个特殊的规定,必须在一排珠子中按顺序从左到右挑选。小张心中已经有一个想要送给小松的单词,请你告诉他应该如何挑选珠子使得手镯上珠子的字母组成小张想要的单词。
输入
第一行,一个字符串,表示货架上的一排珠子,仅包含小写英文字母,长度在200000以内。
第二行,一个字符串,表示小张想要的单词,仅包含小写英文字母,长度在10000以内。
输出
输出一行整数,表示小张按照从左到右需要挑选的珠子在货架上的位置。
注意
从左到右按顺序选出的珠子上的字母为’p’,‘p’,‘y’,‘h’,‘a’。串成环形的手镯后可以组成"happy"。
数据保证有解,若有多种选取方法,输出其中任意一个。
提交后查看结果页面错误信息一栏,前4行的编译错误大家不用理会,第5行是关于你的结果的信息。
样例数据
输入(1)
pxrtpsapyjhuvab
happy
输出(1)
1 5 9 11 14
代码
据说这个题之后数据加强了,要按照字典序输出,那就弄两个数组动态维护呗。。。
#include<stdio.h>
#include<string.h>//这是第九题 礼物
int main()
{
char shelves[200010] = {};
char bracelets[10001] = {};
int pos_1[10003] = {},pos_2[10005] = {};
gets(shelves); //首先我们扫描货架和礼物的情况
gets(bracelets);
long int len1;
int len2;
len1 = strlen(shelves);
len2 = strlen(bracelets);
int n1 = 0, n2 = 0;
int x2;
for(long int x1 = 0; x1 < len1; x1 ++)
{
if(shelves[x1] == bracelets[0])
{
pos_2[n1] = x1;
n1++;
}
} //我们存下货架上每个手串起点的位置
for(x2 = 0; x2 < n1; x2 ++) //依次尝试每个可能的启动点
{
int p = 0;
p = pos_2[x2];
n2 = 1;
for(long int j = p + 1; j % len1 != p; j ++) //从启动点开始,我们执行环形搜索
{
if(bracelets[n2] == shelves[j % len1]) //每找到一个手串里的珠子,我们存下这个柱子在货架上的位置
{
pos_1[n2] = (j % len1) + 1;
n2 ++;
if(n2 == len2)
{
break;
}
}
}
if(n2 == len2) //如果找到了手串上全部的珠子,就退出循环
{
break;
}
}
pos_1[0] = pos_2[x2] + 1;
int m = 0;
//接下来,我们把每个珠子的位置进行排序
for(int j = 1; j <= len2 - 1; j++)
{
for(int i = 0; i < len2 - j; i ++)
{
if(pos_1[i] > pos_1[i + 1])
{
m = pos_1[i];
pos_1[i] = pos_1[i + 1];
pos_1[i + 1] = m;
}
}
}
for(int i = 0; i < len2 - 1; i ++) //输出
{
printf("%d ",pos_1[i]);
}
printf("%d\n",pos_1[len2 - 1]);
return 0;
}