您的位置:首页 > 其它

Codeforces Round #265 (Div. 1)

2014-12-10 22:51 671 查看
A No to Palindromes!

题意:给一个长度为n的用前m个字符构成的字符串,定义一个字符串是好的当且仅当他的每个子串都不是回文的,现在给出一个好的字符串,求比他字典序大的第一个好的字符串。

题解:从后往前每一位枚举,若把当前枚举的位改成ch后为好的串,只需要判断他和他前面的一个字符是否相同构成长度为2的回文串,或者和他前面的前面的两个字符构成长度为3的回文串。

于是找到第一个可以换的位置,后面每个位置从'a'开始枚举可以取得的第一个字符即可。

#include <cstdio>

#include <cmath>

#include <cstring>

#include <iostream>

#include <algorithm>

typedef long long LL;

using namespace std;

const int mod=1e9+7;

string s,q[200000];

LL add[20],shift[20];

int n;

int main()

{

cin>>s;

cin>>n;

for (int i=0;i<10;++i)

{

add[i]=i;

shift[i]=10;

}

for (int i=0;i<n;++i) cin>>q[i];

for (int i=n-1;i>=0;--i)

{

LL dqa=0,dqs=1;

for (int j=q[i].size()-1;j>=3;--j)

{

dqa=(dqa+add[q[i][j]-'0']*dqs)%mod;

dqs=(shift[q[i][j]-'0']*dqs)%mod;

}

int x=q[i][0]-'0';

add[x]=dqa;

shift[x]=dqs;

}

LL ans=0;

for (int i=0;i<s.size();++i) ans=(ans*shift[s[i]-'0']+add[s[i]-'0'])%mod;

cout<<ans<<endl;

return 0;

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: