2 3 aa ab 1 2 a
104 52
POJ 2788题升级版,按反面考虑,最后做差,里面涉及到等比数列求和,等比矩阵求和,、
代码:
/* *********************************************** Author :xianxingwuguan Created Time :2014-2-2 22:56:06 File Name :1.cpp ************************************************ */ #pragma comment(linker, "/STACK:102400000,102400000") #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <limits.h> #include <string> #include <time.h> #include <math.h> #include <queue> #include <stack> #include <set> #include <map> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef unsigned long long ll; const ll mod=100000; struct Matrix{ ll n,mat[40][40]; Matrix(){} Matrix(ll _n){ n=_n; for(ll i=0;i<n;i++) for(ll j=0;j<n;j++) mat[i][j]=0; } }; Matrix mul(Matrix a,Matrix b){ Matrix ans=Matrix(a.n); for(ll i=0;i<a.n;i++) for(ll j=0;j<a.n;j++) for(ll k=0;k<a.n;k++) ans.mat[i][j]=ans.mat[i][j]+a.mat[i][k]*b.mat[k][j]; return ans; } Matrix pw(Matrix a,ll n){ Matrix ans=Matrix(a.n); for(ll i=0;i<a.n;i++) ans.mat[i][i]=1; while(n){ if(n%2) ans=mul(ans,a); a=mul(a,a); n>>=1; } return ans; } struct Trie{ ll next[300][26],fail[300],end[300]; ll L,root; ll newnode(){ for(ll i=0;i<26;i++) next[L][i]=-1; end[L++]=0; return L-1; } void init(){ L=0; root=newnode(); } void insert(char *str){ ll len=strlen(str); ll now=root; for(ll i=0;i<len;i++){ ll p=str[i]-‘a‘; if(next[now][p]==-1) next[now][p]=newnode(); now=next[now][p]; } end[now]=1; } void build(){ queue<ll> q; fail[root]=root; for(ll i=0;i<26;i++) if(next[root][i]==-1) next[root][i]=root; else { fail[next[root][i]]=root; q.push(next[root][i]); } while(!q.empty()){ ll now=q.front(); q.pop(); if(end[fail[now]])end[now]=1; for(ll i=0;i<26;i++) if(next[now][i]==-1) next[now][i]=next[fail[now]][i]; else { fail[next[now][i]]=next[fail[now]][i]; q.push(next[now][i]); } } } Matrix solve(){ Matrix ans=Matrix(L+1); for(ll i=0;i<L;i++) for(ll j=0;j<26;j++) if(!end[next[i][j]]) ans.mat[i][next[i][j]]++; for(ll i=0;i<L+1;i++)ans.mat[i][L]=1; return ans; } }ac; void debug(Matrix a){ cout<<"111: "<<a.n<<endl; for(ll i=0;i<a.n;i++){ for(ll j=0;j<a.n;j++) cout<<a.mat[i][j]<<" "; cout<<endl; } } char str[40]; ll PW(ll a,ll b) { ll ans=1; while(b) { if(b%2) ans*=a; a*=a; b>>=1; } return ans; } ll fun(ll L) { if(L==1) return 26; ll t=0; if(L&1) t=PW(26,L); return (1+PW(26,L>>1))*fun(L>>1)+t; } int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); ll n,l,i,j,k,m; while(cin>>n>>l){ ac.init(); while(n--){ scanf("%s",str); ac.insert(str); } ac.build(); Matrix ans=ac.solve(); // debug(ans); ans=pw(ans,l); ll cnt=0; for(i=0;i<ans.n;i++) cnt=cnt+ans.mat[0][i]; ll cnt1=fun(l); //cout<<cnt1<<" "<<cnt<<endl; cnt1-=cnt; cout<<cnt1+1<<endl; } return 0; }
原文:http://blog.csdn.net/xianxingwuguan1/article/details/18905179