CF633C Spy Syndrome 2

博客介绍了Codeforces竞赛中的CF633C题目,探讨了如何利用trie数据结构结合动态规划(DP)解决 Spy Syndrome 2问题。文章详细分析了在不同位置截断字符串时,如何确定可能的单词,提供了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spy Syndrome 2

题目背景:

CF  633C

分析:又是一道trie + , 这道题是trie + DP,直接针对每一位处理如果从这一位截断,那么形成的单词是什么,具体详见代码

Source:

#include 
    
     
#include 
     
      
#include 
      
       
#include 
       
        
#include 
        
         
#include 
         
           #include 
          
            using namespace std; int n, tot, m; int dp[100010]; string str, s[100010], s1[100010]; struct TRIE { int son[26]; int num; } trie[1000010]; void build_trie(string &s, int num) { int len = s.size(); for (int i = 0; i < len; ++i) if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a'; int position = 0; for (int i = 0; i < len; ++i) { if (!trie[position].son[s[i] - 'a']) trie[position].son[s[i] - 'a'] = ++tot; position = trie[position].son[s[i] - 'a']; } trie[position].num = num; } void dfs(int pos) { if (pos < 0) return ; dfs(pos - s[dp[pos]].size()); cout << s1[dp[pos]] << " "; } int main() { cin >> n >> str >> m; for (int i = 1; i <= m; ++i) cin >> s[i], s1[i] = s[i], build_trie(s[i], i); int position; for (int i = 0; i < n; ++i) { /*对每一位处理,以当前为一个断点是否可以有单词, 若可以,则保存dp[i]为当前单词编号*/ int position = 0; for (int j = i; j >= 0; --j) { if (!trie[position].son[str[j] - 'a']) break; position = trie[position].son[str[j] - 'a']; if (trie[position].num && (i - (i - j + 1) < 0 || dp[i - (i - j + 1)])) { /*判断当前为开头,或者是上一个位置有可行解*/ dp[i] = trie[position].num; break; } } } int pos = n - 1; dfs(n - 1); /*从前往后输出,递归回溯*/ return 0; }
          
         
        
       
      
     
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值