URAL 1002 Phone Numbers(KMP+最短路orDP)
1 ij 2 abc 3 def |
Input
Output
No solution.”. If there are more solutions having the minimum number of words, you can choose any single one of them.#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std; const int MAXV = ;
const int MAXS = ;
const int MAXL = ;
const int MAXE = MAXS * MAXL; int number[] = {, , , , , , , , , , , , , , , , , , , , , , , , , };
int mat[MAXV][MAXV], pre[MAXV], ecnt, n, k;
int s[MAXS][MAXL], src[MAXV], len[MAXS];
char ans[MAXS][MAXL], str[MAXV]; void init() {
memset(mat, -, sizeof(mat));
} void add_edge(int u, int v, int pos) {
mat[u][v] = pos;
} int dis[MAXV]; bool SPFA() {
memset(dis, 0x3f, sizeof(dis));
dis[] = ;
for(int i = ; i < n; ++i) {
for(int j = i + ; j <= n; ++j) {
if(~mat[i][j] && dis[i] + < dis[j]) {
pre[j] = mat[i][j];
dis[j] = dis[i] + ;
}
}
}
return dis[n] <= n;
} void getFail(int P[], int m, int f[]) {
f[] = f[] = ;
for(int i = ; i < m; ++i) {
int j = f[i];
while(j && P[i] != P[j]) j = f[j];
f[i + ] = (P[i] == P[j] ? j + : );
}
} void KMP(int T[], int n, int P[], int m, int f[], int pos) {
getFail(P, m, f);
for(int i = , j = ; i < n; ++i) {
while(j && P[j] != T[i]) j = f[j];
if(P[j] == T[i]) ++j;
if(j == m) add_edge(i - m + , i + , pos);
}
} void print(int pos) {
if(pos - len[pre[pos]] != ) {
print(pos - len[pre[pos]]);
putchar(' ');
}
printf("%s", ans[pre[pos]]);
} int fail[MAXL]; int main() {
while(scanf("%s", str) != EOF) {
if(strcmp(str, "-1") == ) break;
n = strlen(str);
for(int i = ; i < n; ++i) src[i] = str[i] - '';
scanf("%d", &k);
for(int i = ; i < k; ++i) {
scanf("%s", ans[i]);
len[i] = strlen(ans[i]);
for(int j = ; j < len[i]; ++j) s[i][j] = number[ans[i][j] - 'a'];
}
init();
for(int i = ; i < k; ++i)
KMP(src, n, s[i], len[i], fail, i);
if(SPFA()) print(n), puts("");
else puts("No solution.");
}
}
URAL 1002 Phone Numbers(KMP+最短路orDP)的更多相关文章
- 1002 Phone Numbers 解题报告
1002. Phone Numbers Time limit: 2.0 secondMemory limit: 64 MB In the present world you frequently me ...
- 递推DP URAL 1586 Threeprime Numbers
题目传送门 /* 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 所以,dp[i ...
- 递推DP URAL 1009 K-based Numbers
题目传送门 题意:n位数,k进制,求个数分析:dp[i][j] 表示i位数,当前数字为j的个数:若j==0,不加dp[i-1][0]; 代码1: #include <cstdio> #in ...
- ural 2070. Interesting Numbers
2070. Interesting Numbers Time limit: 2.0 secondMemory limit: 64 MB Nikolay and Asya investigate int ...
- ural 1150. Page Numbers
1150. Page Numbers Time limit: 1.0 secondMemory limit: 64 MB John Smith has decided to number the pa ...
- URAL 1056 Computer Net(最短路)
Computer Net Time limit: 2.0 secondMemory limit: 64 MB Background Computer net is created by consecu ...
- URAL 2034 Caravans(变态最短路)
Caravans Time limit: 1.0 secondMemory limit: 64 MB Student Ilya often skips his classes at the unive ...
- URAL 2031. Overturned Numbers (枚举)
2031. Overturned Numbers Time limit: 1.0 second Memory limit: 64 MB Little Pierre was surfing the In ...
- URAL 1012 K-based Numbers. Version 2(DP+高精度)
题目链接 题意 :与1009一样,不过这个题的数据范围变大. 思路:因为数据范围变大,所以要用大数模拟,用java也行,大数模拟也没什么不过变成二维再做就行了呗.当然也可以先把所有的都进行打表,不过要 ...
随机推荐
- Excel VBA
=COUNTIF(Y3:Y212,"=11") =SUMIF(Y3:Y212,"=11",AA3:AA212) =SUMPRODUCT((Y3:Y212=&qu ...
- sp.net2.0中的新增控件BulletedList的一些高级用法
asp.net2.0新增了一个BulletedList控件,通过它可以以列表形式显示数据,而不必再用Repeater,Datalist等实现相同的效果.今天做程序的时候正好用到了这个控件,就把它的一些 ...
- BeanUtils 学习教程
what happens in more sophisticated environments where you do not necessarily know ahead of time whic ...
- Linux下开发Windows平台运行的程序 - MinGW
开源不乏神人,于是有了MinGW(Minimalist GNU for Windows),又称mingw32,是将GCC编译器和GNU Binutils一直到Win32平台下,包含一系列头文件.库和可 ...
- 【Java 基础篇】【第二课】基本数组类型
就像第一章所说一样,这次学习为了快,因此说明性的文字就不想写太多了,直接帖代码吧,代码当中尽量加一些注释: package a.b; public class test { static void B ...
- 设计模式:工厂方法模式(Factory Method)
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类. 结构图: 示例: HTML代码: <html xmlns="http://www. ...
- JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台
JeeSite本身是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓 ...
- Codeforces Round #376 (Div. 2)F. Video Cards(前缀和)
题目链接:http://codeforces.com/contest/731/problem/F 题意:有n个数,从里面选出来一个作为第一个,然后剩下的数要满足是这个数的倍数,如果不是,只能减小为他的 ...
- OO之美3
面向对象和基于对象 基于对象:所以基于对象,就是一种对数据类型的抽象,封装一个结构包含了数据和函数,然后以对象为目标进行操作.构建的基础是对象,但是操作对象并不体现出面向对象的继承性,也就是基于对象局 ...
- fdisk 分区
使用fdisk对SD卡进行从新分区.步骤如下: 1. 查看分区情况 ## sudo fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes 255 h ...