玄学锅求调
查看原帖
玄学锅求调
113521
muyang_233楼主2022/8/8 16:36
#include <cstdio>
#include <cstring>
using namespace std;
int q;
int n;
int nn;
int l[205];
int r[205];
int no[205];
int dp[105];
char t[105];
int last[105];
char s[15][15];
inline void input(int &x){
	x=0;char c=getchar();
	while((c<'0'||c>'9')&&c!='-') c=getchar();
	int p=1;if (c=='-') p=-1,c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();x*=p;
}
inline int min(int a,int b){
	return a<b?a:b;
}
int main(){
	input(q);
	while(q--){
		scanf("%s",t+1);
		input(n);
		for (int i=1;i<=n;i++){
			scanf("%s",s[i]+1);
		}
		memset(dp,0x3f,sizeof(dp));
		memset(last,0,sizeof(last));
		dp[0]=0;nn=0;
		int len=strlen(t+1);
		for (int i=1;i<=len;i++){
//			printf("%d:\n",i);
			for (int j=1;j<=n;j++){
				bool ok=true;
				int m=strlen(s[j]+1),k;
				for (k=1;k<=m;k++){
					if (t[i+k-1]!=s[j][k]){
//						printf("%d\n",k);
						ok=false;
						break;
					}
				}
				if (ok){
//					printf("%d %d\n",i,i+m-1);
//					printf("%d\n",j);
					l[++nn]=i;
					r[nn]=i+m-1;
					printf("%d:%d %d\n",nn,l[nn],r[nn]);
					no[nn]=j;
				}
			}
		}
		for (int i=1;i<=nn;i++){
			printf("%d:%d %d\n",i,l[i],r[i]);
		}
		for (int i=1;i<=len;i++){
			for (int j=1;j<=nn;j++){
				if (l[j]<=i&&i<=r[j]){
					if (dp[l[j]-1]+1<dp[i]){
						dp[i]=dp[l[j]-1]+1;
					 	last[i]=j;
					}
				}
			}
		}
		if (dp[len]==0x3f3f3f3f) dp[len]=-1;
		printf("%d\n",dp[len]);
		if (dp[len]!=-1){
			int now=last[len];
			while(true){
				printf("%d %d\n",no[now],l[now]);
				now=last[l[now]-1];
				if (!now) break;
			}
		}
	}
	return 0;
}

ILE on #6
line 53line 59 输出的 llrr 竟然不一样/jk/jk/jk
求调

2022/8/8 16:36
加载中...