QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#39056#1276. String DistanceclaesWA 3ms5848kbC++2.4kb2022-07-08 12:44:002022-07-08 12:44:01

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-07-08 12:44:01]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:5848kb
  • [2022-07-08 12:44:00]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std ;
char a[100010] , b[25] ;
int dy[25][100010] ;
int dc[25] , la , lb ;
int q ;
int dp[25][25] ;//dp[a][b] = c: b匹配到a,匹配了b个,a最小匹配到c
inline int ef( int t1 , int t2 , int wz )//在a的t1、t2间找b[wz]
{
	if( dc[wz] == 0 ) return -1 ;
	int l = 0 , r = dc[wz] - 1 , mid , ans = dc[wz] - 1 ;
	while( l <= r )
	{
		mid = ( l + r ) / 2 ;
		if( dy[wz][mid] >= t1 )
		{
			ans = mid ;
			r = mid - 1 ;
		}
		else
		{
			l = mid + 1 ;
		}
	}
//	cout<< dy[wz][ans] << endl ;
	if( dy[wz][ans] > t2 ) return -1 ;
	return ans ;
}
int main ()
{
	int t1 , t2 ;
	int t ;
	scanf( "%d" , &t ) ;
	while( t -- )
	{
		memset( dc , 0 , sizeof(dc) ) ;
		scanf( "%s" , &a ) ;
		scanf( "%s" , &b ) ;
		la = strlen(a) ;
		lb = strlen(b) ;
//		if( t == 9 )
//		{
//			for( int i = 0 ; i < lb ; i ++ )
//			{
//				cout<< b[i] ;
//			}
//			cout<< endl ;
//		}
		for( int i = 0 ; i < la ; i ++ )
		{
			for( int j = 0 ; j < lb ; j ++ )
			{
				if( a[i] == b[j] )
				{
					dy[j][dc[j]] = i ;
					dc[j] ++ ;
				}
			}
		}
		scanf( "%d" , &q ) ;
		for( int i = 0 ; i < q ; i ++ )
		{
			memset( dp , -1 , sizeof(dp) ) ;
			scanf( "%d%d" , &t1 , &t2 ) ;
//			if( t == 9 && i == 322 )
//			{
//				cout<< t1 << ' ' << t2 << endl ;
//				return 0 ;
//			}
			t1 -- ;
			t2 -- ;
			dp[0][0] = t1 ;
			int tmp = ef( t1 , t2 , 0 ) ;
//			cout<< "A" << tmp << ' ' << endl ;
			if( tmp != -1 ) dp[0][1] = dy[0][tmp] + 1 ;
//			cout<< dp[0][0] << ' ' << dp[0][1] << endl ;
			for( int i1 = 1 ; i1 < lb ; i1 ++ )
			{
				for( int j = 0 ; j <= i1 + 1 ; j ++ )
				{
					dp[i1][j] = dp[i1 - 1][j] ;
					if( j != 0 )
					{
						if( dp[i1 - 1][j - 1] != -1 )
						{
							int tmp = ef( dp[i1 - 1][j - 1] , t2 , i1 ) ;
//							cout<< tmp << endl ;
							if( tmp != -1 )
							{
								tmp = dy[i1][tmp] ;
								if( dp[i1][j] == -1 || dp[i1][j] > tmp )
								{
									dp[i1][j] = tmp + 1 ;
								}
							}
						}
					}
				}
				if( i == 322 ) cout<< dp[i1][i1 - 6] << " " << dp[i1][i1 - 7] << "  ";
//				cout<< endl ;
			}
			if( i == 322 ) return 0 ;
			int ans = 0 ;
			for( int i1 = lb ; i1 >= 0 ; i1 -- )
			{
				if( dp[lb - 1][i1] != -1 )
				{
					ans = i1 ;
					break ;
				}
			}
			printf( "%d\n" , t2 - t1 + 1 - ans + lb - ans ) ;
		}
	}
	return 0 ;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 5724kb

input:

1
qaqaqwqaqaq
qaqwqaq
3
1 7
2 8
3 9

output:

4
2
0

result:

ok 3 lines

Test #2:

score: -100
Wrong Answer
time: 3ms
memory: 5848kb

input:

10
rtedxofnuatdpogdzftepqhlwiavwisshpvlcwdkzlccofacdisafkpzmppgdwahposjlgqxqdupksokprgaymznbtyuenyikazrmjonfqawzcmuaqowrizdortxplnogmntadqqpwgolfcyqswtncqldgkrmgbovkyaxsuqwzftujheouhiynkjbzdnnhmreheoawkkljxmiwghewmqvjvmywukckjzwvfnjomthjkvijujdksawjmfrrgmhvpqazesdmeyjvougzmhlxrqmdyripgomcrawinxmfiyr...

output:

21
22
23
24
25
26
27
28
29
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
61
62
63
64
65
64
65
66
67
68
69
70
71
72
73
74
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
92
93
94
95
96
95
96
97
98
99
100
101
102
103
102
1...

result:

wrong answer 323rd lines differ - expected: '321', found: '-1 -1  -1 -1  -1 -1  -1 -1  -1...85  323 197  323 323  323 323  '