洛谷 P1470 最长前缀 Longest Prefix

题目传送门

解题思路:

其实思路没那么难,就是题面不好理解,解释一下题面吧.

就是在下面的字符串中找一个子串,使其以某种方式被分解后,每部分都是上面所给集合中的元素.

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 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/12293474.html