热门标签 | 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

 


推荐阅读
  • ZOJ 2760 - 最大流问题
    题目链接:How Many Shortest Paths。题目描述:给定一个包含n个节点的有向图,通过一个n*n的矩阵来表示。矩阵中的a[i][j]值为-1表示从节点i到节点j无直接路径;否则,该值表示从i到j的路径长度。输入起点vs和终点vt,计算从vs到vt的所有不共享任何边的最短路径数量。如果起点和终点相同,则输出无穷大。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 深入解析C++ Atomic编程中的内存顺序
    在多线程环境中,为了防止多个线程同时修改同一数据导致的竞争条件,通常会使用内核级同步对象,如事件、互斥锁和信号量等。然而,这些方法往往伴随着高昂的上下文切换成本。本文将探讨如何利用C++11中的原子操作和内存顺序来优化多线程编程,减少不必要的开销。 ... [详细]
  • 1.打印日历打印日历判断是否是闰年#include<stdio.h>inta[]{0,31,28,31,30,31,30,31,31 ... [详细]
  • A1166 峰会区域安排问题(25分)PAT甲级 C++满分解析【图论】
    峰会是指国家元首或政府首脑之间的会议。合理安排峰会的休息区是一项复杂的工作,理想的情况是邀请的每位领导人都是彼此的直接朋友。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文详细探讨了如何处理包含多种分隔符的字符串分割问题,并提供了一个高效的C++实现方案。 ... [详细]
  • 本题要求计算从起点到终点所有最短路径的总权重,使用SPFA算法进行求解。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
  • GCC(GNU Compiler Collection)是GNU项目下的一款功能全面且高效的多平台编译工具,广泛应用于Linux操作系统中。本文将详细介绍GCC的特点及其基本使用方法。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
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社区 版权所有