思路:
很简单就是对每个点做一次BFS,只要有深度>1的点就说明这个图不是传递的。同时有必要用vector优化一下。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e4+105;
const ll mod = 1e8+7;
int dp[maxn], num[maxn];
char s[maxn];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", s);
int len = strlen(s);
for(int i = 0 ; i < len; i++)
num[i+1] = s[i] - '0';
memset(dp, 0, sizeof(dp));
ll ans = 0;
for(int i = 0; i <= num[1]; i++)
{
if(i > 2) break;
dp[1] = i;
int j;
for(j = 2; j <= len; j++)
{
dp[j] = num[j-1] - dp[j-1] - dp[j-2];
if(dp[j] > 2 || dp[j] < 0) break;
}
if(j <= len || dp[len-1] + dp[len] != num[len]) continue;
ll res = 1;
for(j = 1; j <= len; j++)
if(dp[j] == 1)
res = res * 2 % mod;
ans = (ans + res) % mod;
}
printf("%I64d\n", ans);
}
return 0;
}