Europe - Central >>7325 - Book Borders
题目链接:7325
题目大意:给你一个字符串(含空格),每行x个字符,将单词排列进去,单词不能断开,问每行第一个单词的长度时多少,注意加空格
题目思路:直接模拟。第一个for遍历[a,b],第二个大致为n/a。复杂度大概为nlogn。
开两个数组,v[i]记录i这个位置所属的单词开始位置,e[v[i]]记录第i个位置所属的单词的结束位置。
然后每次判断这一行结尾,所在位置。如果在两个单词中间,则将该单词视为下一行开始,否则将下一个单词视为下一行开始
计算单词长度只需要将e[v[i]] - v[i]即可。
v和e所表示的含义如下图
以下是代码:
#include <bits/stdc++.h>
#define mst(a) memset(a,0,sizeof (a))
#define FOR(i,n) for (int i = 0; i < n; i++)
#define INF 1e9
#define eps 1e-10
using namespace std;
typedef long long ll;
vector <int> vec;
int v[500005];
int e[500005];
int main(){
string s;
while(getline(cin,s))
{
int len = s.size();
int ret = 1;
for (int i = 0; i < len; i++)
{
if(s[i] == ‘ ‘)
{
e[ret] = i;
ret = i + 2;
}
else v[i+1] = ret;
}
e[ret] = len;
int a,b;
scanf("%d%d",&a,&b);
getchar();
for (int i = a; i <= b; i++)
{
int ans = e[v[1]] - v[1] + 1;
for (int f = i; f < len; )
{
if (s[f - 1] == ‘ ‘)
{
ans += e[v[f + 1]] - v[f + 1] + 1;
f = v[f + 1] + i - 1;
ans++;
continue;
}
if (f >= v[f] && f < e[v[f]]) //在中间
{
ans += e[v[f]] - v[f] + 1;
f = v[f] + i - 1;
}
else if (f == e[v[f]]) //在末尾
{
ans += e[v[f + 2]] - v[f + 2] + 1;
f = v[f + 2] + i - 1;
}
ans++;
}
printf("%d\n",ans);
}
}
return 0;
}
/*its a long way to the top if you wanna rock n roll*/
时间: 2024-09-30 16:04:12