题目传送门
解题思路:
其实思路没那么难,就是题面不好理解,解释一下题面吧.
就是在下面的字符串中找一个子串,使其以某种方式被分解后,每部分都是上面所给集合中的元素.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<set> 5 6 using namespace std; 7 8 set<string> a[11]; 9 string l,k,p; 10 bool f[200003]; 11 int ans = -1,m; 12 13 inline int max(int s,int d) { 14 if(s >= d) return s; 15 return d; 16 } 17 18 int main() { 19 while(true) { 20 cin >> l; 21 if(l == ".") break; 22 a[l.length()].insert(l); 23 m = max(m,l.length()); 24 } 25 while(cin >> p) { 26 k = k + p; 27 } 28 f[-1] = 1; 29 for(int i = 0;i < k.length(); i++) { 30 for(int j = min(i,m-1);j >= 0; j--) { 31 string o = k.substr(i - j,j + 1);//提取从i-j开始,长度为5的k的子串 32 if(a[o.length()].count(o) && f[i-j-1]) {//如果o可以被构成,并且除了o其它的也能被构成 33 ans = i; 34 f[i] = 1; 35 break; 36 } 37 } 38 } 39 printf("%d",ans + 1); 40 return 0; 41 }