题目大意:
给出一个字符串T,与N 个字符串S, N个字符串取若干个拼成T,可以重合,问最少拼多少次能拼好。
分析:
对于每一次拼完,我们定义一个指针bt, 表示下一次从bt开始往两边走,所以定义双指针I, J ,分别从小于bt 方向走以及大于bt方向走,并且必须存在I , J 使得T中I 到J的字串在N个字符串S中存在,并且每一次我都要让J最大,不断搜索,找不到,那就无法操作,打出-1;
//AC code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e6 + 120;
string ts, s[maxn];
struct node{
int index;
int station;
}ty;
int main(){
int q;
cin>>q;
while(q--){
cin>>ts;
set<string>ser;
vector<struct node>ver;
int n;
cin>>n;
for(int i = 1; i <= n; i++){
cin>>s[i];
//ser.insert(s[i]);
}
int bt = 0;
int f = 0;
while(bt < ts.length()){
int tem = -1;
int id = 1;
int from = -1;
f = 0;
for(int i = bt; i >= 0; i--){
for(int j = bt; j < ts.length(); j++){
if(j - i > 12) break;
for(int k = 1; k <= n; k++){
if(ts.substr(i, j - i + 1) == s[k]){
f = 1;
if(tem < j){
tem = j;
id = k;
from = i;
}
break;
}
}
}
}
ty.station = from + 1;
ty.index = id;
ver.push_back(ty);
bt = tem + 1;
if(f == 0) break;
}
if(f == 0){
cout<<"-1"<<endl;
}else{
cout<<ver.size()<<endl;
for(int i = 0; i < ver.size(); i++){
cout<<ver[i].index<<" "<<ver[i].station<<endl;
}
}
}
return 0;
}