CF645E-Intellectual Inquiry 贪心
2016-03-21 19:54
393 查看
用f[i]表示以i为结尾的子串的数目,同时记录字母i最后一次出现时的下标last[i]
那么我们为了达到子串数目最大,考虑下一个字母如何填写。
首先,如果附属字母i,那么此时收到影响的只有f[i],f数组中的其他数值并不受影响
其次,当前加入新的字母的增量,就是所有f的和
最重要的是,利用子串数目的递增性质,也就是f数组中,随着i的增加,f的数值同时也是增加的,这就意味着最早出现的字母必然有着最小的f值
那么很容易想到贪心算法,每次找最小的f值更新,将其更新为最大,也就是每次都填入最早出现的字母,至此算法完毕
那么我们为了达到子串数目最大,考虑下一个字母如何填写。
首先,如果附属字母i,那么此时收到影响的只有f[i],f数组中的其他数值并不受影响
其次,当前加入新的字母的增量,就是所有f的和
最重要的是,利用子串数目的递增性质,也就是f数组中,随着i的增加,f的数值同时也是增加的,这就意味着最早出现的字母必然有着最小的f值
那么很容易想到贪心算法,每次找最小的f值更新,将其更新为最大,也就是每次都填入最早出现的字母,至此算法完毕
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define maxn 1000009 #define rep(i, j, k) for(int i = j; i <= k; i++) #define mod 1000000007 #define ll long long using namespace std; int n, m, k, last[maxn]; ll f[maxn]; char s[maxn]; int main () { scanf ("%d%d", &n, &k); scanf ("%s", s); m = strlen (s); memset (f, 0, sizeof (f)); rep (i, 0, m - 1) { ll now = 0; rep (j, 1, k) now = (now + f[j]) % mod; f[s[i] - 'a' + 1] = (now + 1) % mod; last[s[i] - 'a' + 1] = i + 1; } rep (i, 1, n) { ll now = 0; rep (j, 1, k) now = (now + f[j]) % mod; ll Min = last[1]; int p = 1; rep (j, 2, k) if (last[j] < Min) Min = last[j], p = j; f[p] = (now + 1) % mod; last[p] = maxn + i; } ll now = 0; rep (i, 1, k) now = (now +f[i]) % mod; cout << (now + 1) % mod << endl; return 0; }
相关文章推荐
- iOS开发UI篇—ios应用数据存储方式(归档) :转发
- iOS UIImageView居中
- UITableView,UICollectionView和CoreData完美结合进行增删改操作,如何导入大量数据,如何利用NSEntityMigrationPol
- Selected collating sequence not supported by the operating system vc6.0报错
- Core Data Model Versioning and Data Migration Programming Guide
- Android开发优化之——对界面UI的优化(1)
- UITableView的区头(不可滑动)和表头之分
- c# hasvalue属性
- 机房收费系统遇到的问题(三) 那些细节
- HDU 1509 windows message queue
- setPluginsEnabled(true) 谁知道android的4.3之后为什么会报错
- java 使用queue
- Android Volley完全解析(三),定制自己的Request
- 扣丁学堂笔记第05天高级UI组件(一)
- IOS-UIAlertController(UIAlertView和UIActionSheet二合一)
- Android UI 之使用java代码实现动态添加LinearLayout(一)
- Android开发优化之——对界面UI的优化(3)
- SOAP UI
- android -- 蓝牙 bluetooth (三)搜索蓝牙
- 手机字段存储报错 :Warning Code : 1264 Out of range value for column ‘buyer_tpl’ at row 1