热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[POJ2243]研究生备考之路——词汇情感分析

在解决这道题时,我们继续使用AC自动机结合矩阵乘法优化动态规划的方法。与前一题类似,采用了补集转化的思想。不过,本题需要额外构建一个小矩阵来计算\(26^1+26^2+\ldots+26^L\)的值,并且还需要求解所有状态的总和\(f\),以应对不同长度的字符串情况。这种方法不仅提高了算法效率,还确保了对各种输入规模的良好适应性。

  又是AC自动机上用矩乘优化DP= =

  其实和上一题基本一样。。。补集转化思想。。

  只是要多弄一个小矩阵求(26^1+26^2+....+26^L),并且也要求f的总和(因为是长度<=L)

 

  直接调上一题的伪板子了= =

  喜闻乐见CE了好几发。。。就因为iostream里有next这个名字的函数>_<(那我上一题怎么没CE啊摔

  1 #include
  2 #include
  3 #define ll long long
  4 #define ull unsigned long long
  5 using namespace std;
  6 int dl[33],fail[33],num[33];
  7 int ch[33][26],tot,next[33][26];
  8 ull mp[36][36];
  9 ull c[36][36],tmp[36][36],ans;
 10 int i,j,k,n,m,l,r,cnt;
 11 bool gg[103];
 12 char s[23];
 13 
 14 ll tm[103],t[103];
 15 
 16 inline void trie(int n){
 17     int i,p=0;
 18     for(i=0;i){
 19         s[i]-='a';
 20         if(!ch[p][s[i]])ch[p][s[i]]=++tot,p=tot;
 21         else p=ch[p][s[i]];
 22     }
 23     gg[p]=1;//printf("gg:  %d\n",p);
 24 }
 25 inline void getfail(){
 26     int l=0,r=1,i,j,now,p;dl[1]=0;
 27     while(l<r){
 28         now=dl[++l];//printf("   %d  fail:%d    gg:%d\n",now,fail[now],gg[now]);
 29         for(i=0;i<26;i++)if(ch[now][i]){
 30             j=ch[now][i];//printf("  %d-->%d\n",now,j);
 31             for(p=fail[now];p&&!ch[p][i];p=fail[p]);
 32             if(!now)fail[j]=0;else fail[j]=ch[p][i];
 33             dl[++r]=j;gg[j]|=gg[fail[j]];
 34         }
 35     }
 36 }
 37 inline void getnext(){
 38     l=0,r=1;int i,now,p;dl[1]=0;
 39     while(l<r){
 40         now=dl[++l];//printf("    %d\n",now);
 41         for(i=0;i<26;i++){
 42             if(ch[now][i]){
 43                 if(gg[ch[now][i]])next[now][i]=-1;
 44                 else next[now][i]=ch[now][i],dl[++r]=ch[now][i];
 45             }
 46             else{
 47                 for(p=fail[now];p&&!ch[p][i];p=fail[p]);
 48                 next[now][i]=gg[ch[p][i]]?-1:ch[p][i];
 49             }
 50 //            printf("%d %d  next:%d\n",now,i,next[now][i]);
 51         }
 52     }
 53 }
 54 inline void upd(){
 55     cnt=0;int i,j;
 56     for(i=1;i<=r;i++)
 57         num[dl[i]]=++cnt;
 58     for(i=1;i<=r;i++){
 59         j=dl[i];
 60         for(k=0;k<26;k++)if(next[j][k]!=-1)
 61             mp[num[next[j][k]]][num[j]]++;
 62     }
 63     
 64 //    for(i=1;i<=r;puts(""),i++)
 65 //        for(j=1;j<=r;j++)printf("   %lld",mp[i][j]);
 66 }
 67 
 68 
 69 inline void multoc(){
 70     register int i,j,k;
 71     for(i=1;i<=cnt;i++)
 72     for(j=1;j<=cnt;j++)
 73         for(tmp[i][j]=0,k=1;k<=cnt;k++)tmp[i][j]+=mp[i][k]*c[k][j];
 74     for(i=1;i<=cnt;i++)memcpy(c[i],tmp[i],(cnt+1)<<3);
 75 }
 76 inline void multomp(){
 77     register int i,j,k;
 78     for(i=1;i<=cnt;i++)
 79     for(j=1;j<=cnt;j++)
 80         for(tmp[i][j]=0,k=1;k<=cnt;k++)tmp[i][j]+=mp[i][k]*mp[k][j];
 81     for(i=1;i<=cnt;i++)memcpy(mp[i],tmp[i],(cnt+1)<<3);
 82 }
 83 
 84 int main(){
 85     while(scanf("%d%d",&n,&m)!=EOF){
 86         for(i=1;i<=n;i++)scanf("%s",s),trie(strlen(s));
 87         getfail(),getnext(),upd();
 88         cnt++;
 89         for(i=1;i<=cnt;i++)mp[cnt][i]=1;
 90         cnt++,mp[cnt][cnt]=26,cnt++,mp[cnt][cnt-1]=mp[cnt][cnt]=1;
 91         
 92     //    for(i=1;i<=cnt;puts(""),i++)for(j=1;j<=cnt;j++)printf("  %llu",mp[i][j]);
 93         
 94         for(i=1;i<=cnt;i++)c[i][i]=1;
 95         
 96 /*        tm[1]=1;
 97         for(i=1;i<=m;i++){
 98             for(j=1;j<=cnt;j++)
 99                 for(k=1,t[j]=0;k<=cnt;k++)t[j]=(t[j]+mp[j][k]*tm[k])%modd;
100             memcpy(tm,t,sizeof(t));
101         }*/
102         
103         while(m){
104             if(m&1)
105                 multoc();
106             m>>=1;if(m)multomp();
107 //        for(i=1;i<=cnt;puts(""),i++)for(j=1;j<=cnt;j++)printf("  %llu",c[i][j]);
108         }
109         
110 //        for(i=1;i<=cnt;puts(""),i++)for(j=1;j<=cnt;j++)printf("  %llu",c[i][j]);
111         //for(i=1,ans=0;i<=cnt;i++)ans=(ans+c[i][1])%modd;
112         ull ans=c[cnt][cnt-1]*26;
113         for(i=1;i<=cnt-2;i++)ans-=c[i][1];
114         printf("%I64u\n",ans+1);
115         
116         memset(mp,0,sizeof(mp)),memset(c,0,sizeof(c)),
117         memset(ch,0,(tot+1)*4*26),memset(next,0,(tot+1)*4*26),memset(fail,0,(tot+1)<<2),memset(gg,0,tot+1),tot=0;
118     }
119     //    for(i=1,ans=0;i<=cnt;i++)ans=(ans+tm[i])%modd;
120     //    printf("%lld\n",ans);
121     return 0;
122 }
View Code

 


推荐阅读
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 在幼儿园中,有 \( n \) 个小朋友需要通过投票来决定是否午睡。尽管这个问题对每个孩子来说并不是特别重要,但他们仍然希望通过谦让的方式达成一致。每个人都有自己的偏好,但为了集体和谐,他们决定采用一种最小割的方法来解决这一问题。这种方法不仅能够确保每个人的意愿得到尽可能多的尊重,还能找到一个最优的解决方案,使整体满意度最大化。 ... [详细]
  • 题目旨在解决树上的路径最优化问题,具体为在给定的树中寻找一条长度介于L到R之间的路径,使该路径上的边权平均值最大化。通过点分治策略,可以有效地处理此类问题。若无长度限制,可采用01分数规划模型,将所有边权减去一个常数m,从而简化计算过程。此外,利用单调队列优化动态规划过程,进一步提高算法效率。 ... [详细]
  • 本文深入探讨了NDK与JNI技术在实际项目中的应用及其学习路径。通过分析工程目录结构和关键代码示例,详细介绍了如何在Android开发中高效利用NDK和JNI,实现高性能计算和跨平台功能。同时,文章还提供了从基础概念到高级实践的系统学习指南,帮助开发者快速掌握这些关键技术。 ... [详细]
  • 使用Boost.Asio进行异步数据处理的应用程序主要依赖于两个核心概念:I/O服务和I/O对象。I/O服务抽象了操作系统接口,使得异步操作能够高效地执行。I/O对象则代表了具体的网络资源,如套接字和文件描述符,通过这些对象可以实现数据的读写操作。本文详细介绍了这两个概念在Boost.Asio中的应用及其在网络编程中的重要性。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 题目《UVa 11978 福岛核爆问题》涉及圆与多边形交集面积的计算及二分法的应用。该问题的核心在于通过精确的几何运算与高效的算法实现来解决复杂图形的面积计算。在实现过程中,特别需要注意的是对多边形顶点的平移处理,确保所有顶点包括最后一个顶点 \( p[n] \) 都经过正确的位移,以避免因细节疏忽导致的错误。此外,使用循环次数为50次的二分法能够有效提高算法的精度和稳定性。 ... [详细]
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
  • 在Unity3D的第13天学习中,我们深入探讨了关节系统和布料模拟技术。关节系统作为Unity中的关键物理组件,能够实现游戏对象间的动态连接,如刚体间的关系、门的开合动作以及角色的布娃娃效果。铰链关节涉及两个刚体的交互,能够精确模拟复杂的机械运动,为游戏增添了真实感。此外,布料模拟技术则进一步提升了角色衣物和环境装饰物的自然表现,增强了视觉效果的真实性和沉浸感。 ... [详细]
  • CCCCGPLT L2005: 集合相似度计算的双指针算法优化 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • 在单个图表中实现饼图与条形图的精准对齐 ... [详细]
  • Qt 34:深入探讨缓冲区管理、目录操作及文件系统监控技术——QBuffer、QDir与QFileSystemWatcher的应用分析
    本文深入探讨了Qt框架中QBuffer、QDir和QFileSystemWatcher三个核心类的应用。QBuffer作为缓冲区管理工具,提供了高效的数据读写功能;QDir则专注于目录操作,支持路径遍历和文件检索等任务;而QFileSystemWatcher则用于实时监控文件系统的变化,便于应用程序及时响应文件或目录的增删改操作。通过实例分析,详细解析了这三个类在实际开发中的应用场景和实现细节。 ... [详细]
  • 本文介绍了实现链表数据结构的方法与技巧,通过定义一个 `MyLinkedList` 类来管理链表节点。该类包含三个主要属性:`first` 用于指向链表的第一个节点,`last` 用于指向链表的最后一个节点,以及 `size` 用于记录链表中节点的数量。此外,还详细探讨了如何通过这些属性高效地进行链表的操作,如插入、删除和查找等。 ... [详细]
author-avatar
遁高攀_179
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有