USACO2.3.1 The Longest Prefix (prefix)
来源:互联网 发布:无线图像传输 单片机 编辑:程序博客网 时间:2024/04/30 06:56
简单的动态规划问题
bool数组dp[i]表示从s串的开头到第i位是否是一个符合题目要求的字符串
从头到尾扫一遍,枚举字符串数组str[]中存在的序列,临时变量okay表示此序列是否在原串中存在(按位来比较)
如果存在(即okay==1),dp转移方程 dp[i]= dp[i] | dp[i-ll] (ll位当前较短序列的长度,位运算|即表示这两个任何一个为真,则dp[i]赋值1)
倒序扫一遍dp[ ]数组,第一个等于1的dp[i]的i即为最长前缀长,输出即可
/*ID:xsy97051LANG:C++TASK:prefix*/#include <cstdio>#include <cstring>#include <iostream>using namespace std; bool dp[200050];string str[250];char m[200001];int main(){freopen("prefix.in","r",stdin);freopen("prefix.out","w",stdout);string now,st; int len=0; while(cin>>now) {if(now==".") break; len++; str[len]=now; }int sl=0;while(cin>>st) {int l=st.size(); for(int i=sl+1;i<=sl+l;i++) m[i]=st[i-sl-1]; sl+=l; } memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=sl;i++) for(int j=1;j<=len;j++) { bool okay=1; int ll=str[j].size(); if(i<ll) continue; for(int k=0;k<ll;k++) if(str[j][k]!=m[i-ll+1+k]) { okay=0; break; } if(okay) dp[i]=(dp[i]|dp[i-ll]); } for(int i=sl;i>=0;i--) if(dp[i]) { cout<<i<<endl;return 0; }}
0 0
- USACO2.3.1 The Longest Prefix (prefix)
- USACO2.3.1 The Longest Prefix (prefix)
- usaco2.3.1 Longest Prefix
- usaco2.31Longest Prefix
- P1809【USACO2.3.1】Longest Prefix最长前缀 IOI'96
- [USACO2.3]最长前缀 Longest Prefix
- The Longest Prefix
- USACO 2.3 The Longest Prefix (prefix)
- Longest Prefix
- Longest Prefix
- USACO 2.3.1The Longest Prefix
- USACO Section 2.3 The Longest Prefix
- [U]Longest Prefix DP
- usaco: Longest Prefix
- USACO Longest Prefix,DP
- usaco Longest Prefix
- LeetCode: Longest Common Prefix
- LeetCode Longest Common Prefix
- 如何判断android页面加载完毕,以及模拟listview点击
- delphi控件中的 Tag 属性巧用
- JAVA中Session的会话状态
- U3D<<SPACESHOOT>>个人重制版。代码分享(五)其他代码部分
- Appium测试ios环境搭建
- USACO2.3.1 The Longest Prefix (prefix)
- 寒假14项目1——动态链表体验(修改2)
- BZOJ 2339 HNOI2011 卡农 组合数学
- XML--约束模式
- ios开发网络 运营商型号判断
- Io 异常: The Network Adapter could not establish the connection
- stm32定时器时钟源问题
- java通过实体类名称获取对应的数据表名称
- uva10795(汉莫塔)