QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#394066#7789. Outro: True Love Waitswilly109WA 12ms19320kbC++202.4kb2024-04-19 23:28:182024-04-19 23:28:18

Judging History

你现在查看的是最新测评结果

  • [2024-04-19 23:28:18]
  • 评测
  • 测评结果:WA
  • 用时:12ms
  • 内存:19320kb
  • [2024-04-19 23:28:18]
  • 提交

answer

#include <bits/stdc++.h>

#pragma GCC optimize("O3,unroll-loops")
#define pb push_back
#define F first
#define S second 
#define ld long double
#define all(a) a.begin(),a.end()
#define pii pair <int,int>
#define int long long
#define PII pair<pii , pii>
#define sz(v) (int)v.size()
#define rep(i , a , b) for(int i=a;i <= (b);i++)
#define per(i , a , b) for(int i=a;i >= (b);i--)
#define deb(x) cout <<#x << " : " << x << "\n" ;
using namespace std ;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn = 2e6 + 10 , lg = 20,  inf = 1e9+10 , mod = 1e9 + 7 ;
int a4[maxn] , inv3 ;

int po(int a, int b){
    if(b==0)return 1; 
    int v =po(a,b/2 );
    v = v*v % mod ;
    if(b&1)  v= v*a % mod ;
    return v ;
}

int f(int n){
    return (a4[n+1]-4+mod)*inv3%mod ;
}

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); 
    inv3 = po(3,mod-2) ;
    a4[0] = 1;
    rep(i , 1, maxn-1){
        a4[i] = a4[i-1]*4%mod ;
    }
    int t; 
    cin >> t ;
    while(t--){
        string s ,t ;
        int k ;
        cin >> s >> t >> k ;
        if(s == t){
            cout << f(k-1) << "\n"; 
            continue ;
        }
        if(k > 3){
            cout << "-1\n";
            continue ;
        }
        string u ;
        rep(i , 1 , abs(sz(s) - sz(t)))u += '0' ;
        if(sz(s) < sz(t)){
            s = u + s ;
        }else{
            t = u + t; 
        }
        vector <int> vec;
        reverse(all(s)) ;
        reverse(all(t)) ;
        rep(i , 0 , sz(t)-1){
            int a = s[i]-'0' , b =  t[i]-'0'; 
            if(a!=b){
                vec.pb(i) ;
            }
        }
        int ans =0 ;
        if(k == 2 && (sz(vec) == 1 || (sz(vec)==2 && vec[0]/2 == vec[1]/2)) && vec[0]/2 != 0){
            ans = f(vec[0]/2) ;
        }else if(k == 2){
            cout << "-1\n";
            continue ;
        }
        while(sz(vec)){
            int x =vec.back() ;vec.pop_back() ;
            if(x%2==0){
                ans = (ans + f(x/2)+1)%mod ;
            }else if(x%2==1 && (sz(vec) == 0 || vec.back()/2 != x/2)){
                ans = (ans + f(x/2)*3 + 3)%mod; 
            }else{
                ans = (ans + f(x/2)*2 + 2)%mod ;
            }
            while(sz(vec) && vec.back()/2 == x/2)vec.pop_back() ;
        }
        cout << ans << '\n' ;
    }
    return 0 ;
}
/*


*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 19256kb

input:

4
1 10 1
1 10 2
100 0 2
11 11 3

output:

2
-1
9
20

result:

ok 4 number(s): "2 -1 9 20"

Test #2:

score: 0
Accepted
time: 12ms
memory: 19292kb

input:

1
0 0 1

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: 0
Accepted
time: 12ms
memory: 19188kb

input:

100
110111 11111 1
10110 101101 1
11010 111111 1
100110 1 1
10010 11010 1
1100 10111 1
100100 111110 1
101110 101100 1
1011 10110 1
110100 1110 1
11010 11000 1
11110 1000 1
111000 11101 1
110 1001 1
101010 11000 1
10 111110 1
110001 101000 1
1010 1000 1
10101 11 1
111011 11010 1
110001 100000 1
1100...

output:

78
59
69
70
15
38
39
3
32
60
3
29
69
12
45
52
37
3
29
64
22
39
54
69
65
27
33
76
34
18
57
13
81
15
23
70
69
36
18
23
29
42
69
54
6
0
63
3
29
15
10
16
80
24
37
59
71
13
23
31
21
34
23
48
21
47
7
44
42
3
37
75
59
29
55
39
29
28
29
70
55
16
54
47
24
18
79
60
8
26
64
58
32
6
8
37
2
68
42
44

result:

ok 100 numbers

Test #4:

score: -100
Wrong Answer
time: 4ms
memory: 19320kb

input:

100
10011111 111 2
1011101100 1000000100 1
100011111 1001001111 1
1001100101 1100100001 1
10101000 10000100 1
1011110101 100011101 1
110100001 111011010 1
1101001100 1111101101 1
1001101 11011010 1
1101110110 1101011000 1
110011001 1100001111 2
1001111001 1011001111 1
1001110 1101110100 2
1110110100...

output:

-1
248
788
431
73
930
144
319
283
76
-1
305
-1
-1
86
-1
312
293
1293
433
1179
0
884
963
1215
576
-1
1132
499
811
864
949
1322
406
526
862
-1
447
1203
1238
873
-1
18
1131
1108
438
134
359
80
740
1057
752
31
950
1093
1261
650
235
996
876
504
925
1344
450
1010
273
-1
1144
1041
-1
-1
164
-1
11
798
419
1...

result:

wrong answer 1st numbers differ - expected: '295', found: '-1'