题意:题目大致意思是一个人从起点出发,如果前面是绿灯则向前走花费一秒,同时路灯每一秒都会交换一次,红->绿->红往复,而红灯要等一秒灯变绿才能够走。求枚举任意起点到终点所花费的时间的累加和。
思路:算每个灯之间的贡献,如果是01或10就是一秒,00或11就是2秒,乘以需要经过这条路的次数。
但是这样算不准确,因为11刚才算的是2秒,但是如果起点是1(指的是灯的颜色),后一格也是1,那么其实只需要1秒,所以这种情况要减去;
还有,10刚才算的是1秒,但是如果起点是1,后一格是0,那么其实需要2秒,所以这种情况要加上。
然后就没有其他少算或者多算的了。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
typedef long long int ll;
const int maxn = 1e5 + 5;
char s[maxn];
int main()
{
ll ans,cnt,len,i;
int j,n,m,t;
int x;
scanf("%d",&t);
while(t--)
{
ans = 0;
cnt = 0;
scanf("%s",s + 1);
len = strlen(&s[1]);
s[0] = '2';
if(s[1] == '0')
cnt = len;
for(i = 1;i <= len;i++)
{
if(s[i] == s[i - 1])
{
ans = ans + 2 * (len - i + 1) * (i);
}
else
{
ans = ans + (len - i + 1) * (i);
}
if((s[i] == '1' && s[i - 1] == '1'))
{
cnt -= (len - i + 1);
}
if(s[i] == '0' && s[i - 1] == '1')
{
cnt += (len - i + 1);
}
}
printf("%lld\n",ans + cnt);
}
return 0;
}