| 记录编号 |
481545 |
评测结果 |
AAAAWAAAAA |
| 题目名称 |
726.[SDOI 2007] 单词接龙游戏 |
最终得分 |
90 |
| 用户昵称 |
PSI |
是否通过 |
未通过 |
| 代码语言 |
C++ |
运行时间 |
0.129 s |
| 提交时间 |
2018-01-03 13:54:54 |
内存使用 |
5.32 MiB |
显示代码纯文本
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <map>
#include <queue>
#include <stack>
using namespace std;
const int MAXN = 10010;
const int MAXM = 500000;
const int MAXL = 110;
int _w;
struct Vector {
int a[26];
Vector() {
memset(a, 0, sizeof a);
}
bool operator<( const Vector &rhs ) const {
for( int i = 0; i < 26; ++i )
if( a[i] < rhs[i] ) return true;
else if( a[i] > rhs[i] ) return false;
return false;
}
int &operator[]( int i ) {
return a[i];
}
const int &operator[]( int i ) const {
return a[i];
}
};
typedef map<Vector,int>::iterator miter;
map<Vector,int> id;
int nid;
char s[MAXN][MAXL];
void input() {
static char str[MAXL];
while( scanf( "%s", str ) != -1 ) {
int n = (int)strlen(str);
Vector v;
for( int i = 0; i < n; ++i )
v[str[i] - 'a']++;
if( !id.count(v) ) {
id[v] = ++nid;
for( int i = 0; i <= n; ++i )
s[nid][i] = str[i];
}
}
}
namespace G {
int head[MAXN], nxt[MAXM], to[MAXM], eid;
void init() {
eid = 0;
memset(head, -1, sizeof head);
}
void adde( int u, int v ) {
to[eid] = v, nxt[eid] = head[u], head[u] = eid++;
}
}
void build() {
G::init();
for( miter it = id.begin(); it != id.end(); ++it ) {
Vector v = it->first;
int u = it->second;
for( int i = 0; i < 26; ++i ) {
++v[i];
id.count(v) ? G::adde(u, id[v]) : void();
--v[i];
}
}
}
int f[MAXN], in[MAXN], g[MAXN];
queue<int> q;
void solve() {
using namespace G;
build();
for( int i = 1; i <= nid; ++i )
for( int e = head[i]; ~e; e = nxt[e] )
++in[to[e]];
for( int i = 1; i <= nid; ++i )
if( !in[i] )
q.push(i), f[i] = 1, g[i] = 0;
while( !q.empty() ) {
int u = q.front(); q.pop();
for( int i = head[u]; ~i; i = nxt[i] ) {
int v = to[i];
if( f[u] + 1 > f[v] )
f[v] = f[u] + 1, g[v] = u;
--in[v] ? void() : q.push(v);
}
}
}
stack<int> stk;
void output() {
int u = 1;
for( int i = 2; i <= nid; ++i )
f[i] > f[u] ? u = i : 0;
printf( "%d\n", f[u] );
return;
while(u) stk.push(u), u = g[u];
while( !stk.empty() )
puts( s[stk.top()] ), stk.pop();
}
int main() {
freopen("wordgame.in","r",stdin);
freopen("wordgame.out","w",stdout);
input(), solve(), output();
return 0;
}