QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#39061#1276. String DistanceJamiiiiiiTL 2ms3756kbC++111.9kb2022-07-08 12:49:462022-07-08 12:49:47

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:49:47]
  • 评测
  • 测评结果:TL
  • 用时:2ms
  • 内存:3756kb
  • [2022-07-08 12:49:46]
  • 提交

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] < t1 || 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) ;
		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 ) ;
			t1 -- ;
			t2 -- ;
			dp[0][0] = t1 ;
			int tmp = ef( t1 , t2 , 0 ) ;
			if( tmp != -1 ) dp[0][1] = dy[0][tmp] + 1 ;
			for( int i = 1 ; i < lb ; i ++ )
			{
				for( int j = 0 ; j <= i + 1 ; j ++ )
				{
					dp[i][j] = dp[i - 1][j] ;
					if( j != 0 )
					{
						if( dp[i - 1][j - 1] != -1 )
						{
							int tmp = ef( dp[i - 1][j - 1] , t2 , i ) ;
							if( tmp != -1 )
							{
								tmp = dy[i][tmp] ;
								if( dp[i][j] == -1 || dp[i][j] > tmp )
								{
									dp[i][j] = tmp + 1 ;
								}
							}
						}
					}
				}
			}
			int ans = 0 ;
			for( int i = lb ; i >= 0 ; i -- )
			{
				if( dp[lb - 1][i] != -1 )
				{
					ans = i ;
					break ;
				}
			}
			printf( "%d\n" , t2 - t1 + 1 - ans + lb - ans ) ;
		}
	}
	return 0 ;
}

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 3756kb

input:

1
qaqaqwqaqaq
qaqwqaq
3
1 7
2 8
3 9

output:

4
2
0

result:

ok 3 lines

Test #2:

score: -100
Time Limit Exceeded

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: