Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <cstdarg>
- #include <cassert>
- #include <cstring>
- #include <cstdio>
- #include <vector>
- #include <string>
- #include <queue>
- #include <set>
- #include <map>
- using namespace std;
- typedef long long LL;
- typedef long double LD;
- #define all(c) (c).begin(),(c).end()
- #define sz(c) (int)(c).size()
- #define pb push_back
- #define mp make_pair
- #define fs first
- #define sc second
- #define y1 y1_gedjcdgfce
- #define y0 y0_sadasdasdsa
- #define ws ws_sadsadsada
- #define left left_asdsadsadsadsa
- #define right right_asdasdsadasda
- #define hash hash_asdasdasdsad
- #define eprintf(...) {fprintf(stderr,__VA_ARGS__),fflush(stderr);}
- #define forn(i,n) for( int i = 0 ; i < (n) ; i++ )
- #define forit(it,c) for( __typeof((c).begin()) it = (c).begin() ; it != (c).end() ; it++ )
- #ifdef WIN32
- #define INT64 "%I64d"
- #else
- #define INT64 "%lld"
- #endif
- #define TASK "task"
- const int maxn = 113;
- int term[maxn];
- int next[maxn][2];
- int suf[maxn];
- char str[maxn];
- int len[maxn];
- int p[maxn];
- int size = 2;
- int cmplen(int a, int b) {
- return len[a] < len[b];
- }
- int go(int s, int ch) {
- if (next[s][ch] != -1) return next[s][ch];
- return go(suf[s], ch);
- }
- long double res[maxn][maxn];
- long double tmp[maxn][maxn];
- int main(){
- memset(next, -1, sizeof next);
- memset(suf, -1, sizeof suf);
- memset(term, 0, sizeof term);
- next[0][0] = next[0][1] = 1;
- len[0] = -2;
- len[1] = -1;
- suf[1] = 0;
- for (int k = 0; k < 2; k++) {
- scanf("%s", str);
- int p = 1;
- for (int i = 0; str[i]; i++) {
- if (next[p][str[i] - '0'] == -1) {
- next[p][str[i] - '0'] = size++;
- }
- p = next[p][str[i] - '0'];
- len[p] = i;
- }
- term[p] |= 1 << k;
- }
- for (int i = 0; i < size; i++) p[i] = i;
- sort(p, p + size, cmplen);
- for (int i = 1; i < size; i++) {
- if (next[p[i]][0] != -1) {
- suf[next[p[i]][0]] = go(suf[p[i]], 0);
- }
- if (next[p[i]][1] != -1) {
- suf[next[p[i]][1]] = go(suf[p[i]], 1);
- }
- }
- for (int i = 2; i < size; i++) {
- term[p[i]] |= term[suf[p[i]]];
- }
- for (int i = 1; i < size; i++) {
- if (term[i] != 0) {
- res[i][i] = 1.;
- continue;
- }
- res[i][go(i, 0)] = 0.5;
- res[i][go(i, 1)] = 0.5;
- }
- for (int iter = 0; iter < 200; iter++) {
- for (int i = 0; i < size; i++)
- for (int j = 0; j < size; j++)
- tmp[i][j] = 0.;
- for (int i = 0; i < size; i++)
- for (int j = 0; j < size; j++)
- for (int k = 0; k < size; k++)
- tmp[i][j] += res[i][k] * res[k][j];
- for (int i = 0; i < size; i++)
- for (int j = 0; j < size; j++)
- res[i][j] = tmp[i][j];
- }
- long double answer = 0.;
- for (int i = 1; i < size; i++) {
- if (term[i] == 1) answer += res[1][i];
- }
- printf("%.20lf\n", (double)answer);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment